我知道,只要超过capacity()
,矢量就会变大一倍。这个操作需要一些时间,这就是为什么向量应该按照push_back()
添加元素的分摊常数时间。
我想知道的是......当向量缩小以使其size()
小于capacity()
的一半时会发生什么。
载体是否放弃了它们使用的记忆,或者直到载体被破坏它才消失?
如果它们的尺寸没有缩小,可能会浪费很多内存,但我从来没有听说过它们具有这种功能。
答案 0 :(得分:12)
不,它永远不会被释放(即容量永远不会减少)直到毁灭。释放一些内存的常用习惯是创建一个正确大小的新向量,然后使用它:
std::vector<type>(originalVector).swap(originalVector);
(受“More Exceptional C ++”启发,第7项)
答案 1 :(得分:3)
如果你想确保你的矢量使用尽可能少的空间,你可以说:
std::vector<Foo>(my_vector).swap(my_vector);
您也可以调用shrink_to_fit()
成员函数,但这只是一个非约束性请求。
答案 2 :(得分:0)
从向量中删除元素甚至完全清除向量不一定释放与该元素关联的任何内存。这是因为自创建以来向量的最大大小是对向量未来大小的良好估计。
std::vector<int> v;
//v is swapped with its temporary copy, which is capacity optimal
std::vector<int>(v).swap(v);
C ++ 0x中的解决方案
在C ++ 0x中,一些容器将这样的习惯用法称为函数shrink_to_fit(),例如: vector,deque,basic_string。 shrink_to_fit()是一个非约束请求,用于将capacity()减小为size()。
答案 3 :(得分:0)
它们的尺寸不会缩小。
取消分配内存通常没用。
例如,矢量现在可以缩小,但之后会再次增长。释放额外的内存(并复制内存中的所有元素)只是为了以后重新分配它将是一种浪费。
如果矢量正在收缩,那么矢量很可能会缩小为空,然后被破坏。在这种情况下,因为收缩而解除分配也会浪费时间。
重用向量对象也是一种有用的优化,以避免分配/处理内容。这会因为收缩而引入解除分配而毁掉。
基本上,大多数时候释放额外的内存是不值得的。在少数情况下,您可以特别要求进行交易。
答案 4 :(得分:-1)
内存消失,直到矢量被破坏。