矢量的容量何时会减少?

upd*_*liu 4 c++ stl

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

如果我只能通过使用一个向量insert(),erase(),push_back(),pop_back(),clear(),当容量不够,就会增加和再分配对将发生载体.但在什么情况下容量会减少?容量减少是否必然导致重新分配?

Oli*_*rth 9

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

除非另有规定(显式或通过在其它功能来定义的函数),调用一个容器成员函数或传递容器作为参数传递给一个库功能必须迭代不失效,或者改变的值,即容器内的对象.

并且没有其他规格,例如pop_back.

这意味着不能进行重新分配.1


1.在评论中已经建议另一个答案,也许可以释放对应于弹出元素的存储器,这不会使对"实时"元素的任何引用无效.

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

保证在调用之后发生的插入期间不会发生重新分配,reserve()直到插入将使向量的大小大于值的值为止capacity().


nul*_*ent 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);
}
Run Code Online (Sandbox Code Playgroud)

shrink_to_fit()在C++ 11