【发布时间】:2010-09-20 04:05:09
【问题描述】:
当我不再需要以前保留的空间时,有没有办法调整 std::vector 的大小以降低容量?
【问题讨论】:
当我不再需要以前保留的空间时,有没有办法调整 std::vector 的大小以降低容量?
【问题讨论】:
Effective STL,Scott Meyers,第 17 条:使用swap 技巧来削减过剩产能。
vector<Person>(persons).swap(persons);
之后,persons 被“缩小以适应”。
这依赖于 vector 的复制构造函数仅分配被复制元素所需的内存。
【讨论】:
如果您使用的是 C++11,则可以使用 vec.shrink_to_fit()。至少在 VS2010 中,这对你来说是交换技巧。
【讨论】:
shrink_to_fit 是一个非绑定请求,允许不做任何事情。
shrink_to_fit 很可能会使用交换技巧或realloc,但会进行小的向量优化,但仍然不会重置capacity() 以匹配size(),因为没有堆分配收缩。我认为这就是它被指定为“非约束性”的原因。
从现有向量创建一个新的临时向量,然后在现有向量上调用 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() 在 交换技巧的条款...
【讨论】:
shrink_to_fit() 必须以swap() 的形式实现?
您正在寻找 QVector::squeeze 的等价物,恐怕它在 STL 中并不明确存在。 如果 Sébastien 的答案对您的 STL 实现是正确的,请寻求它。
【讨论】: