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

Why is dynamicaly allocated array's size upon insertion 2*size of the initial array, rather than size+1?

本文关键字:数组 大小 插入 动态分配 为什么      更新时间:2023-10-16

我是一名计算机科学专业的学生,我一直在尝试更深入地理解stl::vector。我发现,向量实际上是动态数组,这意味着在插入/删除时,如果需要,数组的大小会调整。

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

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

我认为这样做的原因是,也许每隔一段时间而不是每次插入/删除才创建一个两倍大的数组或重新定位数组具有更好的时间复杂性,但是例如,如果我有一个大对象的数组,即使这样重新分配一个大小是原始数组的两倍,也会更好吗? 还是使用尺寸+1?

感谢您的回复。

原因是数学。

具有您描述的重新分配策略(或任何指数增长,就此而言,因子无关紧要)的容器保证在末尾插入元素的渐近平均恒定成本,即插入 n 个元素的成本,全部除以 n,收敛到一个常量值,因为 n 变大。这是因为随着 n 的增长,分配变得越来越罕见。

如果每次插入

时总是将阵列增加 1,则每次插入都会产生线性成本。

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