一概には言えません。イテレータが無効化される理由の 1 つは、無効化されたイテレータがどの要素を参照したいかを理解する方法がないためです。
たとえば、要素 3 の 5 への反復子があります。要素 2 を消去します。反復子は新しい要素 2 を指す必要があります (「同じ値が下に移動した」ため)、または新しい要素 3 を指す必要があります (なぜなら、それは「異なる値が下に移動したベクトルの同じ要素」です)?
実際には、次のオプションがあります。
- 他の誰かがイテレータを持っている間は、要素を挿入/消去しないでください。これは、別の機会に変更を加えるためにコードを変更することを意味します。
- イテレータの代わりにインデックスを使用します。これにより、上記の 2 番目のオプションが得られます (「インデックスは、新しい値を持つ同じ要素を参照します」)。インデックスが最後から外れるほど多くの要素を消去すると、インデックスも無効になる可能性があることに注意してください。
- 異なるイテレータ無効化規則で異なるデータ構造を使用します。たとえば、 a
std::list
は上記の最初のオプションを提供します(「イテレータは新しい位置の同じ要素を参照します」)
反復処理に使用している反復子は、その位置での単一要素の挿入/消去によって有害に無効化されてはなりません。これは無効になりますが、どちらの関数も反復処理を続行するために使用できる新しい反復子を返します。new iterator が参照する要素については、ドキュメントを参照してください。そのため、同じコンテナーで複数のイテレーターを使用している場合にのみ問題が発生します。