(这个问题不是关于shrink_to_fit
技巧(在C ++ 11中使用swap()
或shrink_to_fit()
)。)
如果我仅通过insert()
,erase()
,push_back()
,pop_back()
,clear()
使用向量,当容量不足时,它会增加并将发生向量的重新分配。但在什么情况下容量会减少?容量减少是否必然导致重新分配?
答案 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()
。这严格依赖于实现,因此实现可能会独立,但您不应该依赖于该行为。