1

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

我的问题如下:我有:

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

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

  • 而且我知道 vlist 的向量中的元素总数 M <= N (N 和 M 可能非常大)

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

如何尽可能有效地做到这一点?

非常感谢。

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

4

3 回答 3

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);

如果您真的想要最有效的方法,您可能必须实现几种不同的方法并比较它们的速度。

于 2012-05-15T20:06:58.197 回答
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)。

于 2012-05-15T20:20:13.680 回答
0

最有效的方法是不复制它。您的应用程序在做什么需要它?另外,为什么你有 avector<* vector<int> >而不是 just vector<vector<int> >?围绕它进行设计,使用 pimpl、惰性复制等。

最后,我不确定你认为你能做什么来击败 std 的默认复制构造函数。您是否分析过您的应用程序以确定默认 ctor 是瓶颈?

于 2012-05-15T20:09:49.430 回答