题
当我不再需要以前预留的空间时,有没有办法调整 std :: vector
的大小以降低容量?
解决方案
有效的STL,作者:Scott Meyers,第17项:使用 swap
技巧修剪多余的容量。
vector<Person>(persons).swap(persons);
之后,人
被“缩小以适应”。
这取决于 vector
的复制构造函数只根据被复制元素的需要分配内存。
其他提示
如果您使用的是C ++ 11,则可以使用 vec.shrink_to_fit()
。至少在VS2010中,这可以为你做交换技巧。
从现有的向量中创建一个新的临时向量,然后在现有向量上调用swap方法,传递临时值。让临时(现在使用旧的超大缓冲区)超出范围。
嘿presto,你的矢量的内容大小合适。
如果这听起来像是大量的复制和分配 - 请记住,这就是每次必须重新分配超过当前保留限制时矢量所做的事情。
[编辑] 是的,我只是说塞巴斯蒂安更多的话。 stackoverflow竞争条件的另一种情况; - )
交换技巧是减少对象容量的有效方法, 它通过复制构造将我的矢量内容与新创建的内容交换:
vector<Person>(persons).swap(persons);
请注意,不能保证persons.capacity();交换技巧等于之后 大小:向量(人)的容量是库实现的能力 保留大小的人的矢量.size()。
C ++ 11引入了 shrink_to_fit()。
shrink_to_fit()以及交换技巧并不能保证容量大小有效 缩小到矢量的大小。
无论如何,shrink_to_fit()会使你的迭代器失效(如果发生了重新分配)或者不能: 这取决于库的实际实现。
请记住,交换技巧需要person.size()复制Person和的构造 person.size()destructions。 shrink_to_fit()可以避免所有这些复制,并且可以 让你的迭代器有效。可以。但有时会发生shrink_to_fit()的实现 交换技巧的条款......
您正在寻找相当于 QVector :: squeeze 而且我担心它在STL中不存在明显的存在。 如果STL实施正确,请转到S&#233; bastien的答案。