2016-09-11 6 views
0

私は、ベクトルから要素を消去するコードを書きましたが、forループでイテレータを使って消去した後、私のプログラムはクラッシュしています。イテレータを介してベクトルに要素を挿入しても、同じ結果になります。ここでは、コードスニペットは次のとおりです。Vectorのイレーズと挿入関数がイテレータを無効にするのはなぜですか?

vector<int>v1; 
v1.reserve(8); 
v1.push_back(10); 
v1.push_back(8); 
v1.push_back(12); 
v1.push_back(3); 
v1.push_back(7); 
v1.push_back(5); 
v1.push_back(17); 
v1.push_back(1); 
int x=6; 
std::vector<int>::iterator get_it; 
get_it = v1.begin(); 
for(;get_it!= v1.end();get_it++) 
{ 
    if(*get_it < x) 
    { 
     v1.insert(get_it, 6); 
    } 
} 

私はちょうど要素の消去またはVectorコンテナで起こった要素を挿入した後、イテレータを無効の背後にある理由を理解しようとしています。

何か説明してください。

+1

'erase'と' insert'の両方が、イテレーションを続けるのに使うことができる有効なイテレータを返すことに注意してください。 –

答えて

4

ベクトルはメモリを動的に割り当てます。ベクトルに十分な空き容量がない場合は、新しいメモリを割り当て、古いメモリからデータをコピーする必要があります。イテレータは基本的にベクトルがラップするメモリへのポインタです。したがって、ベクトルがメモリを再割り当てすると、イテレータ( "ポインタ")はもはや割り当てられたメモリを指すのではなく、古い空きメモリを指します。

しかし、これはちょうどです。の理由です。もう1つは、ベクトルが配列をエミュレートし、配列のようにベクトルの要素が連続して格納されることです。ベクトルの途中で要素を挿入または削除すると、挿入/削除された要素の後のすべてのデータを調整し、要素を連続したままにするために新しい位置に移動する必要があります。繰り返しになりますが、移動した要素を「指す」イテレータは、もはや正しい場所を指していません。

関連する問題