回答
典型行为:在内部,std::vector
具有长度capacity
的连续阵列。在任何给定的点上,实际上只使用size
元素。如果在任何时候size
会超过capacity
(假设你叫push_back()
很多),一个新的,更大的内部数组被分配(capacity
可能翻倍)。然后将旧数组中的所有元素都复制到新数组中,并删除旧元素和数组。
太棒了!感谢大家! – Russel 2010-11-21 23:07:08
细节与实现有关,但由矢量分配的内存块保证连续。
GCC在重新分配内存时使用2.0系数,MSVC使用1.5系数。
前段时间有人讨论了关于最佳系数的C++。lang.moderated,Alexandrescu的显着参与,我认为他们推断它是'alpha'('x^2 = x + 1'的正根) ) – 2010-11-22 07:28:24
大多数实现都使用一个简单的数组,并且每当数组变满时,容量加倍。这确实涉及到将现有元素复制到新的内存块中,但补偿的原因是您不必在一段时间内再次执行此操作。 (使用这种技术,元素添加运行在分期固定的时间内。)
另请注意,链表实现虽然看起来很吸引人,但并未满足'std :: vector'要求,即*内存中的连续布局。* – 2010-11-21 22:52:54