为什么在插入初始数组的2 *大小时动态分配数组大小,而不是大小+ 1?

时间:2015-01-06 09:05:24

标签: c++ arrays dynamic vector

我是一名大学计算机科学专业的学生,​​我一直试图在更深层次上理解stl :: vector。我发现,vector实际上是动态数组,意思是在插入/删除时,如果需要,可以调整数组的大小。

一位朋友告诉我,当数组重新分配时,例如在插入时,而不是创建一个大小为[原始+ 1]的新数组,它会创建一个大小为[2 *原始]的新数组。

在插入/删除某些内容时,仅添加(或减去)一个数组字段会更好,而不是创建两倍大的数组,而不使用许多索引?

我认为这样做的原因是,也许创建一个两倍大的数组,或重新分配数组,只是每隔一段时间而不是每次插入/删除都有更好的时间复杂性,但是,例如,如果我有一个大型对象的数组,那么重新分配一个两倍于原始大小的数组,或者使用大小+ 1,它会更好吗?

感谢您的回复。

1 个答案:

答案 0 :(得分:1)

原因是数学。

具有您描述的重新分配策略的容器(或任何指数增长,因此,因素无关紧要)保证渐近平均常量成本用于插入元素最后,即插入 n 元素的成本全部除以 n ,当 n 变大时收敛到一个常数值。这是因为随着 n 的增长,分配变得越来越少。

如果您在每次插入时总是将数组增加一个,则每次插入都会产生线性成本。

请注意,std::vector在C ++的本机数组类型new T[N]意义上不是“动态分配的数组”;而是将内存分配与对象构造分开。指数增长的是std::vector分配的内存。构造对象的数量始终精确地是容器的当前大小。