更改C ++向量的保留内存

时间:2008-11-25 23:47:12

标签: c++ memory stl vector resize

我有一个1000个“节点”的载体

 if(count + 1 > m_listItems.capacity())
     m_listItems.reserve(count + 100);

问题是当我要重新填充它时,我也清楚了。

m_listItems.clear();

容量不会改变。 我用过调整大小(1);但这似乎并没有改变容量。 那么如何改变储备呢?

5 个答案:

答案 0 :(得分:20)

vector<Item>(m_listItems).swap(m_listItems);

将再次缩小m_listItemshttp://www.gotw.ca/gotw/054.htm(Herb Sutter)

如果你想要清除它,用空载体交换:

vector<Item>().swap(m_listItems);

当然更有效率。 (请注意,交换向量基本上意味着只交换两个指针。没有什么真正耗费时间)

答案 1 :(得分:2)

你可以像其他人建议的那样交换矢量,并且如http://www.gotw.ca/gotw/054.htm中所述,但要注意它免费,你要执行每个元素的副本,因为vector必须分配一个新的,较小的内存块,并复制所有旧内容。 (交换操作基本上是免费的,但是您正在使用原始矢量数据的副本进行临时交换,其中免费)

如果事先知道向量有多大,则应该开始分配正确的大小,因此不需要调整大小:

std::vector<foo> v(1000); // Create a vector with capacity for 1000 elements

如果您事先不知道容量,为什么它会浪费一点空间呢?是否值得将每个元素复制到一个新的和更小的向量(这是std :: vector(v).swap(v)将会做什么),只是为了节省几千字节的内存?

同样,当您清除矢量时,如果您打算重新填充 ,将其容量设置为零似乎是浪费时间。

修改

  

baash05:如果你有1000000件商品怎么办?   10公顷的公羊。你可以说   减少开销是多少   重要?

没有。调整向量大小需要暂时更多内存,因此如果您受内存限制,可能会破坏您的应用。 (你必须将原始向量放在内存中,是临时的,然后你可以交换它们,所以你最终在这一点上使用了两倍的RAM)。之后,您可能会节省少量内存(最多几MB),但这没关系,因为向量中的多余容量永远不会被访问,因此会被推送到页面文件,所以不会首先计入你的RAM限制。

如果您有1000000个项目,那么您应该首先将矢量初始化为正确大小

如果你不能那样做,那么你通常最好不要仅仅留下容量。特别是既然你说你要重新填充向量,你肯定应该重用已经分配的容量,而不是分配,重新分配,复制和释放所有内容。

您有两种可能的情况。要么你知道需要存储多少元素,要么你不知道。如果您知道,那么您可以首先创建具有正确大小的向量,因此您永远不需要调整大小,或者您不知道,然后您可以保留多余的容量,所以至少它在重新填充矢量时,不必向上调整大小。

答案 2 :(得分:1)

您可以从here

尝试此技巧
std::vector< int > v;
// ... fill v with stuff...
std::vector< int >().swap( v );

答案 3 :(得分:1)

您可以swap使用具有所需容量的新矢量。

vector< int > tmp;
old.swap( tmp );

答案 4 :(得分:1)

据我所知,你不能将矢量重新分配到比以往更低的容量;你只能将它分配得更大。这有充分的理由;其中之一是重新分配过程是计算密集型的。如果你真的需要一个较小的向量,释放旧的向量并创建一个较小的向量。这实际上比使矢量实际调整得更小更简单。