2011-10-11 20 views
11

C++11より前のディープコピーオーバヘッドを避けるために、vObjectsに移動するにはどうすればよいですか?swapの前にスワップツーバックを使用しました。
ここでは、マルチアレイのような回避策がたくさんあること、あるいはObjects.back()に直接挿入することしか知りませんが、std::moveの使い方の例が必要です。std :: moveを使って

+2

なぜあなたはまったく 'v'を作成するのですか?空白のベクトルをObjectに追加し、次にObjects.back()。push_back()をそれに追加するだけではどうですか?これにより、より簡単なオーバーヘッドが削除されます。 – Ayjay

+0

@Ayjay:質問の残りの部分を読む – Dani

答えて

16
vector<vector<Object> > Objects; 

for(/* some range */) 
{ 
    vector<Object> v; 
    for(/* some other range */) 
    { 
     v.push_back(/* some object */); 
    } 
    Objects.push_back(std::move(v)); 
} 
+0

しかし、それは後ろに 'v'を残します。私は 'std :: move'はやや破壊的であるべきだと理解しました。 – Dani

+2

@Dani:想定しないでください。それを試してみてください。実際、 'vector :: vector(vector &&)'のソースを読むだけで十分でしょう。セマンティクスはあなたの 'std :: swap'バージョンにはかなり近いですが、一般的なケースではよりエレガントで効率的です。 – sehe

+0

' Object'のデフォルトコンストラクタが自明でない場合は、より効率的です。 – ildjarn

17
Objects.push_back(std::move(v)); 
+2

+1正しい答えを得て、あまり注意を払わないでください – sehe

関連する問題