矢量容量和储备

时间:2011-05-17 12:34:42

标签: c++ stl memory-leaks vector

请考虑以下代码段:

std::vector<int> v;
v.reserve(100);
v.insert(v.end(), 100, 5);

v.erase(v.begin(), v.end());

std::cout << v.capacity << std::endl;

打印出100。这是否意味着向量仍然保留了100个内存位置?是否需要在向量上调用reserve(0)后调用erase(begin,end),以放弃向量所占用的所有空间?

4 个答案:

答案 0 :(得分:5)

如果容量为100,则vector为100个元素分配空间。 reserve(0)是无操作,因为reserve不会缩小容量。

reserve(n)尝试将分配增加到至少 n元素的足够空间。无法保证它会成功,它不会报告失败并且可能会过度分配。

除非您使用和不使用代码测量代码,否则请不要致电reserve,并发现它会产生重大影响。 reserve的所有其他用法都是过早优化。

答案 1 :(得分:2)

您正在寻找着名的互换技巧:

vector<T>().swap(myVector);

请参阅此处了解背景资料

How to downsize std::vector?

答案 2 :(得分:2)

正如提醒一样,C ++ 0x / 11将shrink_to_fit便利功能添加到STL容器中,该容器已在VS2010中提供,所以如果您在Windows上进行编码(使用VS),您会很幸运)。 :)

答案 3 :(得分:1)

是的,矢量仍然有100个位置。 reserve仅用于增加大小,但无法缩小大小。 reserve(0);电话根本没有效果。在C ++ 1x中,我相信会有一个你感兴趣的shrink_to_fit电话。

在当前标准中,您必须使用交换技巧来释放由向量分配的存储,但在此之前,请仔细考虑您是否真的想要这样做。如果稍后再将元素添加回向量,则只需重新分配。除非你在嵌入式系统上,否则让vector管理自己的内存。

交换技巧:使用vector<T>().swap(myvector);释放向量的存储。