我是一名大学计算机科学专业的学生,我一直试图在更深层次上理解stl :: vector。我发现,vector实际上是动态数组,意思是在插入/删除时,如果需要,可以调整数组的大小。
一位朋友告诉我,当数组重新分配时,例如在插入时,而不是创建一个大小为[原始+ 1]的新数组,它会创建一个大小为[2 *原始]的新数组。
在插入/删除某些内容时,仅添加(或减去)一个数组字段会更好,而不是创建两倍大的数组,而不使用许多索引?
我认为这样做的原因是,也许创建一个两倍大的数组,或重新分配数组,只是每隔一段时间而不是每次插入/删除都有更好的时间复杂性,但是,例如,如果我有一个大型对象的数组,那么重新分配一个两倍于原始大小的数组,或者使用大小+ 1,它会更好吗?
感谢您的回复。
答案 0 :(得分:1)
原因是数学。
具有您描述的重新分配策略的容器(或任何指数增长,因此,因素无关紧要)保证渐近平均常量成本用于插入元素最后,即插入 n 元素的成本全部除以 n ,当 n 变大时收敛到一个常数值。这是因为随着 n 的增长,分配变得越来越少。
如果您在每次插入时总是将数组增加一个,则每次插入都会产生线性成本。
请注意,std::vector
在C ++的本机数组类型new T[N]
意义上不是“动态分配的数组”;而是将内存分配与对象构造分开。指数增长的是std::vector
分配的内存。构造对象的数量始终精确地是容器的当前大小。