C ++:向量中向量列表的有效副本

时间:2012-05-15 20:02:47

标签: c++ vector stdvector

我正在寻找一种最有效的方法来复制向量中的向量列表的内容。我想尽可能避免内存重新分配。

我的问题如下: 我有:

  • 包含N个元素的std::vector<int> v

  • 向量std::vector< std::vector<int>* > vlist

  • 的列表
  • 我知道vlist向量中元素M的总数是&lt; = N. (N和M可能非常大)

我想在v中复制vlist的所有元素(首先是vlist [0]的所有元素,然后是vlist [1]的所有元素等等),最后将v大小减小为M(我的项目不使用C ++ 2011)。

如何尽可能高效地完成这项工作?

非常感谢。

编辑:备注:v已经填充了N个元素,我想用来自其他向量的M(&lt; = N)元素替换它们。

3 个答案:

答案 0 :(得分:1)

我不知道这是最有效的方式,但这是的一种方式

std::vector<int> v;
std::vector< std::vector<int>* > vlist;
int j = 0;
for(int i = 0; i < vlist.size(); ++i) {
  std::copy(vlist[i]->begin(), vlist[i]->end(), &v[j]);
  j += vlist[i]->size();
}
v.resize(j);

如果真的想要最有效的方式,您可能需要实施几种不同的方式并比较它们的速度。

答案 1 :(得分:0)

最有效的方法是不复制它。您的应用程序在做什么需要它?另外,为什么你有一个vector<* vector<int> >而不仅仅是vector<vector<int> >?围绕它设计,使用pimpl,懒惰副本等。

最后我不确定你认为你能做什么会打败std的默认拷贝构造函数。您是否已分析过您的应用程序以确定默认的ctor是瓶颈?

答案 2 :(得分:0)

std::vector<int> v;
v.reserve(N);
for(size_t i = 0; i<vlist.size(); i++)
{
   v.insert(v.end(), vlist[i]->begin(), vlist[i]->end());
}

如果M接近N,这应该足够有效。否则最好在分配内存之前计算M,并使用v.reserve(M)。