2012-03-19 13 views
25

を私は2つのベクトルを持っているし、1にそれらを結合したい場合、私はそれを次の方法を行うことができます。私は避けしたい、しかし、コピーを伴う「移動」二つのベクトルを一緒

std::vector<T> a(100); // just some random size here 
std::vector<T> b(100); 

a.insert(std::end(a), std::begin(b), std::end(b)); 

。移動セマンティクスを併用する方法はありますか?
vectorは連続しているはずなので、私はそれを非常に疑っています。しかし、dequeでそれを行う方法はありますか?あなたが移動イテレータを使用することができ、また

#include <algorithm> 
std::move(b.begin(), b.end(), std::back_inserter(a)); 

を::

答えて

48

はい、std::move使用

a.insert(a.end(), 
     std::make_move_iterator(b.begin()), std::make_move_iterator(b.end())); 

は両方のケースで#include <iterator>に覚えている、とあなたが開始する前に、言う:

a.reserve(a.size() + b.size()); 

照合およびインクリメントと比較した値の初期化のコストに応じてサイズカウンターを入力すると、次のような変形もあります:

std::size_t n = a.size(); 
a.resize(a.size() + b.size()); 
std::move(b.begin(), b.end(), a.begin() + n); 
+0

ありがとう、今私はなぜcppreferenceに 'std :: move'の二つのバージョンがあるのか​​知っています。私はいつもそれがバグだと思って、2番目のバージョンをチェックしませんでした。 – inf

+3

私は完全に見逃していました。「動き」もアルゴリズムでした。 – bames53

+0

@ bames53同じことが私には起こりますが、それを聞いた後、それは 'コピー'もあるので完全に意味をなさないでしょう。 – inf

7

正確に移動したいものによって異なります。ベクタを移動すると、内部配列ポインタを効果的に交換することによって行われます。したがって、別のベクトルが以前に所有していた配列を1つのベクトルにすることができます。

しかし、2つのベクトルをマージすることはできません。

あなたができる最善のKerrekの答えに示すように、すべての個々のメンバーの要素を移動することです:

再び
std::move(b.begin(), b.end(), std::back_inserter(a)); 

、これはベクトルを反復処理し、ターゲットベクトルにすべての要素を移動します。

+0

質問ですが、違いはありますか?基本的にaのオブジェクトをbの位置にコピーしていませんか? opの質問と同じように挿入されませんか? – nnrales

+0

私は、オブジェクトが複雑な場合、それらのコピーctorsは呼び出されません、ちょうどメモリコピー? – nnrales

関連する問題