4

(这个问题与shrink_to_fit技巧无关(使用swap()shrink_to_fit()在 C++11 中)。)

如果我只通过insert(), erase(), push_back(), pop_back(),使用一个向量clear(),当容量不够时,它会增加并且会发生对向量的重新分配。但是在什么情况下容量会减少呢?容量减少是否一定会导致重新分配?

4

4 回答 4

9

该标准保证在例如pop_back. 来自 [container.requirements.general]:

除非另有规定(明确地或通过根据其他函数定义函数),调用容器成员函数或将容器作为参数传递给库函数不应使该容器内对象的迭代器无效或更改其值.

并且没有其他规范,例如pop_back

所以这意味着不会发生重新分配。1


1.在对另一个答案的评论中建议,也许可以释放与弹出元素相对应的内存,这不会使对“活动”元素的任何引用无效。

但这会阻止数组重新增长,因为标准明确指出插入不能引发重新分配,直到大小超过容量。来自 [vector.capacity]:

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

于 2012-05-21T15:13:22.507 回答
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);
}

shrink_to_fit()c++11 中

于 2012-05-21T14:52:32.370 回答
0

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

于 2012-05-21T14:54:16.787 回答
0

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

于 2012-05-21T14:52:15.187 回答