C++ 更改C++;矢量

C++ 更改C++;矢量,c++,memory,stl,vector,resize,C++,Memory,Stl,Vector,Resize,我有一个有1000个“节点”的向量 问题是,当我要重新加注时,我也会将其清除 m_listItems.clear(); 容量不变。 我使用了调整大小(1);但这似乎并没有改变容量。 那么如何改变储备呢?你可以从 std::vectorv; // ... 用东西填满v。。。 std::vector().swap(v); 您可以使用具有所需容量的新向量交换它 vector< int > tmp; old.swap( tmp ); vectortmp; 旧互换(tmp); 这当然更有

我有一个有1000个“节点”的向量

问题是,当我要重新加注时,我也会将其清除

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

你可以从

std::vectorv;
// ... 用东西填满v。。。
std::vector().swap(v);

您可以
使用具有所需容量的新向量交换它

vector< int > tmp;
old.swap( tmp );
vectortmp;
旧互换(tmp);

这当然更有效。(请注意,交换向量基本上意味着只交换两个指针。没有什么真正耗时的事情发生)

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

您可以按照其他人的建议交换向量,如中所述,但请注意它不是免费的,您正在执行每个元素的副本,因为向量必须分配一个新的、更小的内存块,并将所有旧内容复制过来。(交换操作基本上是免费的,但您正在使用一个用原始向量数据的副本初始化的临时文件进行交换,该文件不是免费的)

如果您事先知道向量有多大,则应首先分配正确的大小,因此无需调整大小:

std::vector<foo> v(1000); // Create a vector with capacity for 1000 elements
标准向量v(1000);//创建一个可容纳1000个元素的向量
如果你事先不知道容量,为什么它会浪费一点空间呢?为了节省几千字节的内存,将每个元素复制到一个新的、更小的向量(std::vector(v).swap(v)就是这么做的)值得吗

类似地,当您清除向量时,如果您打算重新填充它,将其容量设置为零似乎是一种令人印象深刻的时间浪费

编辑:

baash05:如果你有1000000件物品呢 10兆公羊。你会说 减少开销是非常必要的 重要吗

不需要。临时调整向量大小需要更多内存,因此如果内存有限,可能会破坏应用程序。(在交换原始向量和临时向量之前,必须先将它们存储在内存中,因此最终使用的RAM是原来的两倍)。之后,您可能会节省少量内存(高达几MB),但这并不重要,因为向量中多余的容量永远不会被访问,因此它会被推送到页面文件中,因此首先不会计入RAM限制

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

如果你不能做到这一点,那么你最好还是不考虑容量。特别是,既然您声明要重新填充向量,那么您肯定应该重用已经分配的容量,而不是不断地分配、重新分配、复制和释放所有内容


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

如果您有1000000个项目和10兆ram,该怎么办。您认为减少开销量很重要吗?这取决于它是如何分配的-您要么让它超出范围,要么调用delete。与交换相比,我认为这不是一个好建议。您的系统内存不足吗?像这样保留意味着向其中添加n个项目需要O(n^2)时间,最多n+100个对象的空间加上舍入误差。让向量扩展本身将减少代码、O(n)时间,并且在大多数实现中最多使用2*n的空间加上舍入。我的系统内存非常不足。(嵌入式)。。这段代码实际上只是我想实现的一个例子。在大多数情况下,我从“表”中获得1000个项目块,因此以相同的频率调整大小是有意义的。清理是我最关心的问题。值得指出的是,虽然swap()非常便宜,但在第一种情况下构建m_listItems的临时副本需要复制向量中的每个元素。因此,完全清除向量(将容量设置为0)是很便宜的。缩小规模否则就不太可能了。但如果vector本身有一个shrink()函数,那么这个序列本质上是相同的。无论如何都需要重新分配:/但是你的观点很好,因为在c++1x中,向量可以将它们的元素移动到新的位置。我的代码应该只看vector(std::move(m_listItems)).swap(m_listItems);然后我想我是在寻找答案。。没有真正缩小尺寸。我使用向量作为填充列表的工具。老实说,我以为它是用链表实现的。看来我错了。。哦,现在已经足够快了。@litb:移动它可能不起作用,因为结果与:m_listItems.swap(m_listItems);这是禁止的。
vector< int > tmp;
old.swap( tmp );
vector<Item>(m_listItems).swap(m_listItems);
vector<Item>().swap(m_listItems);
std::vector<foo> v(1000); // Create a vector with capacity for 1000 elements