std::vector
当我不再需要以前保留的空间时,有没有办法将 a 调整为更低的容量?
5 回答
有效的 STL,Scott Meyers,第 17 条:使用swap
技巧来削减过剩产能。
vector<Person>(persons).swap(persons);
之后,persons
就是“缩小以适应”。
这依赖于这样一个事实,即vector
的复制构造函数只为被复制的元素分配所需的内存。
如果您使用的是 C++11,则可以使用vec.shrink_to_fit()
. 至少在 VS2010 中,这对你来说是交换技巧。
从现有向量创建一个新的临时向量,然后在现有向量上调用 swap 方法,将临时向量传入。让临时向量(现在使用旧的、过大的缓冲区)超出范围。
嘿 presto,您的矢量具有完全适合其内容的大小。
如果这听起来像很多复制和分配 - 请记住,这就是向量每次必须重新分配超过其当前保留限制时所做的事情。
[编辑] 是的,我只是用更多的话和塞巴斯蒂安说了同样的话。stackoverflow竞争条件的另一种情况;-)
交换技巧是减少对象容量的一种有效方法,它通过复制构造将我的向量的内容与新创建的向量交换:
vector<Person>(persons).swap(persons);
请注意,不能保证 person.capacity(); 在交换技巧等于大小之后:vector(persons) 的容量是库实现为大小为 person.size() 的向量保留的容量。
C++11 引入了shrink_to_fit()。
shrink_to_fit() 以及交换技巧并不能保证容量大小有效地减小到向量的大小。
无论如何, shrink_to_fit() 可以使您的迭代器无效(如果发生重新分配)或不能:这取决于库的实际实现。
请记住,交换技巧需要 Person.size() 复制构造 Person 和 person.size() 破坏。shrink_to_fit() 可以避免所有这些复制,并使您的迭代器保持有效。可以。但是有时会发生 shrink_to_fit() 是根据交换技巧实现的......
您正在寻找QVector::squeeze的等价物,恐怕它在 STL 中并不明确存在。如果您的 STL 实现正确,请寻求 Sébastien 的答案。