我正在寻找一种最有效的方法来复制向量中的向量列表的内容。我想尽可能避免内存重新分配。
我的问题如下: 我有:
包含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)元素替换它们。
答案 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)。