2009-08-25 2 views
3

C++標準では、std::vector::insertに渡されたイテレータのペアが元のシーケンスと重ならないように宣言していますか?overlapped vectors :: insertの動作

編集:手の込んだ、私は標準がこのような状況に対処するために、標準ライブラリを必要としないことをかなり確信している:

std::vector<int> v(10); 
std::vector<int>::iterator first = v.begin() + 5; 
std::vector<int>::iterator last = v.begin() + 8; 
v.insert(v.begin() + 2, first, last); 

しかし、私はそれがだろう、標準で何かを見つけることができませんでした範囲[first, last)[v.begin(), v.end())が重複しないようにしてください。

答えて

7

23.1.1/4シーケンス要件があります

の式: a.insert(P、i、j)は

戻り値の型:無効

前提条件:i、jはのイテレータではありません。 pの前に[i、j]の要素のコピーを挿入します。

したがってijは、あなたのベクトルへのイテレータではありません。

挿入操作中にベクトルがサイズ変更される必要があるため、既存の要素を最初に新しいメモリ位置にコピーすることができます(現在のイテレータを無効にする)。

+0

ありがとう、これは私が探していたものです。 :-) – avakar

+1

「p」ではなく「i」と「j」を意味することを確かめてください。 'p' *はベクトルへの反復子でなければなりません。 –

+0

ロブをキャッチしてくれてありがとう。 –

3

許可されている場合の動作を考慮してください。ベクトルに挿入するたびに、イテレータの開始と終了の間隔が1ずつ増加し、開始イテレータが1つ上に移動します。したがって、開始イテレータは終了イテレータに到達せず、メモリ不足例外が発生するまでアルゴリズムは実行されます。

+0

この規格に明示的にこの要件が記載されていないと言っていますか? – avakar

+0

私はそれを素早くチェックしました。それは明示的ではありません。 – AraK

+0

AraK、すべての点で敬意を払って、どうすればそのようなことをすぐに確認できますか? – avakar

関連する問題