34

std::vector当我不再需要以前保留的空间时,有没有办法将 a 调整为更低的容量?

4

5 回答 5

60

有效的 STL,Scott Meyers,第 17 条:使用swap技巧来削减过剩产能。

vector<Person>(persons).swap(persons);

之后,persons就是“缩小以适应”。

这依赖于这样一个事实,即vector的复制构造函数只为被复制的元素分配所需的内存。

于 2008-10-31T11:09:37.600 回答
19

如果您使用的是 C++11,则可以使用vec.shrink_to_fit(). 至少在 VS2010 中,这对你来说是交换技巧。

于 2012-03-01T23:32:38.960 回答
8

从现有向量创建一个新的临时向量,然后在现有向量上调用 swap 方法,将临时向量传入。让临时向量(现在使用旧的、过大的缓冲区)超出范围。

嘿 presto,您的矢量具有完全适合其内容的大小。

如果这听起来像很多复制和分配 - 请记住,这就是向量每次必须重新分配超过其当前保留限制时所做的事情。

[编辑] 是的,我只是用更多的话和塞巴斯蒂安说了同样的话。stackoverflow竞争条件的另一种情况;-)

于 2008-10-31T11:09:58.317 回答
3

交换技巧是减少对象容量的一种有效方法,它通过复制构造将我的向量的内容与新创建的向量交换:

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() 是根据交换技巧实现的......

于 2013-11-20T10:05:59.330 回答
-1

您正在寻找QVector::squeeze的等价物,恐怕它在 STL 中并不明确存在。如果您的 STL 实现正确,请寻求 Sébastien 的答案。

于 2008-10-31T11:12:37.907 回答