1

ベクトル内のベクトルのリストの内容をコピーするための最も効率的な方法を探しています。メモリの再割り当てはできるだけ避けたいです。

私の問題は次のとおりです:私は持っています:

  • N個のstd::vector<int> v要素を含む

  • ベクトルのリスト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

最も効率的な方法は、それをコピーしないことです。それを必要とするあなたのアプリケーションは何をしていますか?また、なぜあなたはvector<* vector<int> >ただの代わりに持っているのvector<vector<int> >ですか?その周りをデザインし、pimpl、lazycopyなどを使用します。

そして結局、私はあなたが何ができると思うかわかりません。それはstdのデフォルトのコピーコンストラクターを打ち負かすでしょう。アプリケーションのプロファイルを作成して、デフォルトのコンストラクターがボトルネックであると判断しましたか?

于 2012-05-15T20:09:49.430 に答える
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 に答える