2012-12-28 5 views
6

可能性の重複:
Does moving a vector invalidate iterators?移動によってstd :: vector :: data()が保持されますか?

次のコードを考えてみましょう:

std::vector<T> prepare(T*& data) { 
    std::vector<T> buffer; 
    // Fill in buffer. 
    data = buffer.data(); 
    return buffer; 
} 

... 

T* data; 
auto vec = prepare(data); 
// line 12 

は、それが可能ライン12でvec.data() != dataということですか?同様に、

std::vector<T> buffer; 
// ... Fill in buffer ... 
T* data = buffer.data(); 
auto vec = std::move(buffer); 
// line 5 

行5のvec.data() != dataは可能でしょうか?

実際には、移動コンストラクタは単純なポインタ代入として実装されているため、libstdC++とlibC++の実装ではどちらも使用できませんが、標準では何も指定していないようです(Is the capacity required to be preserved when moving a std::vector?)。 "一定の複雑さ"を保証することができますvec.data() == data

+0

イテレータ/ポインタを無効にするものは、かなりよく列挙されています。 –

+0

関連項目:http://stackoverflow.com/questions/4124989/does-stdvectorswap-invalidate-iterators –

答えて

0

コンテナが個々の要素のコピー/移動を許可されていないため、既存の記憶域の所有権を新しいオブジェクトに移す必要があるため、data()が返すポインタは同じでなければなりません。

ベクトルのアロケータタイプに対してpropagate_on_container_move_assignmentが真であるか、またはアロケータが等しいかどうかを示す場合にのみ真である、ムーブアサインメント(コンストラクションの移動ではない)。

+0

一部の狂った実装では、一定数の個々の要素を移動/コピーできます。 – zch

+0

@zch:それは隣接性の要件によって禁止されています。 –

+0

@BenVoigt、 'if(<10)copyAll();そうでなければmoveOwnership(); '? – zch

関連する問題