当我不再需要以前预留的空间时,有没有办法调整 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的答案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top