我有一个1000个“节点”的载体
if(count + 1 > m_listItems.capacity())
m_listItems.reserve(count + 100);
问题是当我要重新填充它时,我也清楚了。
m_listItems.clear();
容量不会改变。 我用过调整大小(1);但这似乎并没有改变容量。 那么如何改变储备呢?
答案 0 :(得分:20)
vector<Item>(m_listItems).swap(m_listItems);
将再次缩小m_listItems
:http://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)
据我所知,你不能将矢量重新分配到比以往更低的容量;你只能将它分配得更大。这有充分的理由;其中之一是重新分配过程是计算密集型的。如果你真的需要一个较小的向量,释放旧的向量并创建一个较小的向量。这实际上比使矢量实际调整得更小更简单。