繁体   English   中英

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

[英]C++ : efficient copy of a list of vectors in a vector

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

我的问题如下:我有:

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

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

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

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

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

非常感谢你。

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

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

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

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

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

最后,我不确定您认为您能做些什么,这会击败std的默认副本构造函数。 您是否已对应用程序进行了概要分析,以确定默认的ctor是瓶颈?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM