2011-08-10 8 views
1

2つのコンテナの値を入れ替えると、イテレータが無効にならないと言われています。一時的なコンテナでスワップした後にイテレータが無効になる

ので、次のコードは、

vector<int> v1; 
v1.push_back(1); 
vector<int>::iterator i = v1.begin(); 

vector<int> v2(v1); 
v2.swap(v1); 
cout<<*i<<endl; //output 1 

正常に動作しますが、私はイテレータが無効になり、一時的なコンテナになって、プログラムがクラッシュしたとき。

vector<int> v1; 
v1.push_back(1); 
vector<int>::iterator i = v1.begin(); 

vector<int>(v1).swap(v1); 
cout<<*i<<endl; //i become invalid and program crashes here 

これは愚かな質問かもしれませんが、何が間違っているのか把握できません。

+0

なぜこの質問を閉じる投票がありますか?私には妥当だと思われる。 –

+1

インデックスは、ベース配列に関連しているので、代わりに格納することができます。 – GManNickG

答えて

3

イテレータは、それをスワップするコンテナに属しているからです。一時的にスワップすると、イテレーターは一時的なメンバーを指しているので、一時的なものは破棄され、イテレーターは無効になります。

私はそれがどのように動作するのかはわかりませんが、ベクトルのイテレータがスワップ後に有効であると考えることができる唯一の方法です(新しい配列を割り当てるのではなく、コピーなど)。

+0

清算していただきありがとうございます。ブロックの終わりに一時は破壊されるべきだと思った。 – asir6

1

だけ文の終わり(;

vector<int>(v1).swap(v1); 

までの一時的な遺跡を次の範囲は、今v1は、セミコロンで破壊されます自身のコピーを、含まれているため。したがって、イテレータiは、そのあと;の後に無効なイテレータを指します。

+1

これは重要なポイントです。名前のない一時的なテンポラリは、最後の使用時点までしか存続しません。 – Keith

0

2番目のコードの抜粋は、v1のコピーを作成してからv1でスワップしています。これによりv1ベクターが破壊され、イテレータが無効になります。

2

ここでのイテレータは、単純に配列内の項目へのポインタ以上のものではありません。

どちらの場合でも、ベクトルの内部配列を入れ替えることができます。最初のケースでは、イテレータは2番目のベクトルが所有する配列をポイントします。 2番目のケースでは、反復子は、所有された配列へのポインタを指し、は、テンポラリベクトルによって既にを解放しています。

関連する問題