请考虑以下代码段:
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)
,以放弃向量所占用的所有空间?
答案 0 :(得分:5)
如果容量为100,则vector
为100个元素分配空间。 reserve(0)
是无操作,因为reserve
不会缩小容量。
reserve(n)
将尝试将分配增加到至少 n
元素的足够空间。无法保证它会成功,它不会报告失败并且可能会过度分配。
除非您使用和不使用代码测量代码,否则请不要致电reserve
,并发现它会产生重大影响。 reserve
的所有其他用法都是过早优化。
答案 1 :(得分:2)
答案 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);
释放向量的存储。