0

私は以下のようなベクトルを持っています

vector<unsigned int> myvector;
vector<unsigned int>::iterator it;

//fill it 
for (i=1; i<=10; i++) myvector.push_back(i);

//I want delete first one 
it = myvector.begin();
myvector.erase(it++);

//I want to know if I am in last element
if(it != myvector.end()) 
      cout << "a test";

しかし、比較式でプログラムがクラッシュします。なぜ?

4

4 に答える 4

6

簡単に言えば、 を呼び出した後erase()、ベクトル内の消去された位置またはそれ以降の位置を指すすべての反復子が無効になるためです。たとえば、これに関する公式ドキュメントについては、こちらを参照してください。

于 2012-08-07T12:30:36.810 に答える
5

erase()消去ポイント以降のイテレータを無効にするためです。

OTOH、戻り値は消去された要素の後の要素を指すイテレータであるため、次のように実行できます。

it = myvector.erase(it);
if (it == myvector.end()) { ... }
于 2012-08-07T12:30:58.283 に答える
2

消去すると次の有効なイテレータが返されるため、消去中に「i」をインクリメントする必要はありません

これはおそらくあなたの質問に答えると思います

https://stackoverflow.com/a/4645727/623546

于 2012-08-07T12:34:34.053 に答える
1

消去された要素の位置とベクトルの終わりの間の反復子は、によって無効化されerase()ます。ここを参照してください。

于 2012-08-07T12:32:21.937 に答える