矢量的容量何时会减少?

时间:2012-05-21 14:49:51

标签: c++ stl

(这个问题不是关于shrink_to_fit技巧(在C ++ 11中使用swap()shrink_to_fit())。)

如果我仅通过insert()erase()push_back()pop_back()clear()使用向量,当容量不足时,它会增加并将发生向量的重新分配。但在什么情况下容量会减少?容量减少是否必然导致重新分配?

4 个答案:

答案 0 :(得分:9)

该标准保证在例如期间不会使引用/迭代器无效。 pop_back。来自[container.requirements.general]:

  

除非另有说明(显式或通过根据其他函数定义函数),调用a   容器成员函数或将容器作为参数传递给库函数不应无效   迭代器,或更改该容器中对象的值。

并且没有其他说明,例如pop_back

这意味着不能重新分配。 1

<小时/> <子> 1。在评论中已经建议另一个答案,也许可以释放对应于弹出元素的内存,这不会使对“实时”元素的任何引用无效。

但是这会阻止阵列重新生成,因为标准明确指出插入不会引起重新分配,直到大小超过容量。来自[vector.capacity]:

  

保证在之后发生的插入过程中不会发生重新分配   调用reserve(),直到插入使向量的大小大于。{   capacity()的价值。

答案 1 :(得分:5)

不,pop_back()没有这样做。其他人当然不会。唯一的方法是你提到的方式。

template< typename T, class Allocator >
void shrink_capacity(std::vector<T,Allocator>& v)
{
   std::vector<T,Allocator>(v.begin(),v.end()).swap(v);
}

c ++ 11中的shrink_to_fit()

答案 2 :(得分:0)

当使用量低于容量的1/4时,可以减少(这将给出重新分配的摊销不变成本)。但是,当您仅使用列出的方法时,STL实现没有义务随时减少向量。

答案 3 :(得分:0)

C ++标准版在其存在期间的任何时间点都不需要std::vector来减少capacity()。这严格依赖于实现,因此实现可能会独立,但您不应该依赖于该行为。