如何缩小std :: vector?

有没有办法调整std :: vector来降低容量,当我不再需要以前保留的空间?

有效的STL,Scott Meyers,项目17:使用swap技巧来调整多余的能力。

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

之后, persons “缩水”。

这依赖于vector的拷贝构造函数只为需要复制的元素分配内存。

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

从现有的向量创build一个新的,临时的向量,然后调用现有的向量的交换方法,传递临时的向量。让临时(现在用旧的超大缓冲区)超出范围。

嘿presto,你的载体的内容正确的大小。

如果这听起来像是大量的复制和分配 – 请记住,这是vector每次必须重新分配超过其当前保留的限制。

[编辑]是的,我只是用更多的话说就像塞巴斯蒂安一样。 另一种情况是stackoverflow比赛条件;-)

交换技巧是减less对象容量的有效方法,它通过拷贝构造将我的向量的内容与新创build的对象交换:

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

请注意,不能保证persons.capacity(); 交换技巧等于大小之后:vector(个人)的容量是库实现保留给size.size()大小的向量的容量。

C ++ 11引入了shrink_to_fit() 。

shrink_to_fit()以及交换技巧并不能保证容量大小有效地减less到向量的大小。

无论如何,shrink_to_fit()可以使你的迭代器(如果发生重新分配)无效或不能:它取决于库的实际实现。

请记住,交换技巧需要persons.size()复制Person和person.size()的构造。 shrink_to_fit()可以避免所有这些复制,并可以让你的迭代器有效。 可以。 但不时发生的情况是shrink_to_fit()是按照交换技巧实现的。

你正在寻找一个QVector :: squeeze的等价物,恐怕它不在STL中明确存在。 如果您的STL实施正确,请转到Sébastien的答案。