我的问题是关于vector :: push\_back的效果,我知道它在向量的末尾添加了一个元素但是在引擎盖下发生了什么?

IIRC内存对象是按顺序方式分配的,所以我的问题是vector :: push\_back是否只是在向量之后立即分配更多内存,如果是这样,如果该位置没有足够的可用内存会发生什么?或者也许在“结束”中添加指针以使向量“跳”到它继续的位置?或者只是通过将其复制到另一个有足够空间且旧副本被丢弃的位置来重新分配?或者别的什么?

解决方法:

如果已经分配了足够的空间,则对象将根据参数进行复制构造.当没有足够的内存时,向量将按照某种几何级数增长它的内部数据缓冲区(每次新的大小为k * old\_size,k> 1 [1])并且原始缓冲区中存在的所有对象将随后被移动到新的缓冲区.操作完成后,旧缓冲区将被释放到系统.


在上一句中,移动不用于技术移动构造函数/移动分配意义上,它们可以被移动或复制或任何等效操作.

[1]增长因子k> 1确保push\_back的摊余成本是恒定的.实际常量因实现而异(Dinkumware使用1.5,gcc使用2).摊销成本意味着即使每次推送都会非常昂贵(当时矢量大小为O(N)),这些情况很少发生,因此整个插入集合上的所有操作的成本都是插入次数呈线性,因此每次插入平均成本不变)

标签: vector, c, push-back

相关文章推荐

添加新评论,含*的栏目为必填