C++ コンテナの反復子無効化ルールは何ですか?
(注:このQ&AはStack Overflow の C++ FAQ質問自体についてのメタディスカッションは、このすべてを始めたメタ質問(ここではありません。)ベストアンサー1
C++03 (出典:イテレータ無効化ルール (C++03))
挿入
シーケンスコンテナ
vector
: 挿入ポイントより前のすべての反復子と参照は、新しいコンテナのサイズが以前の容量より大きい場合を除き、影響を受けません(その場合、すべての反復子と参照は無効になります)[23.2.4.3/1]deque
: 挿入されたメンバーがデックの最後(先頭または最後)にある場合を除き、すべてのイテレータと参照は無効化されます(この場合、すべてのイテレータは無効化されますが、要素への参照は影響を受けません)[23.2.1.3/1]list
: すべての反復子と参照は影響を受けません [23.2.2.3/1]
連想コンテナ
[multi]{set,map}
: すべての反復子と参照は影響を受けません [23.1.2/8]
コンテナアダプタ
stack
: 基になるコンテナから継承queue
: 基になるコンテナから継承priority_queue
: 基になるコンテナから継承
消去
シーケンスコンテナ
vector
: 消去ポイント以降のすべての反復子と参照は無効になります [23.2.4.3/3]deque
: 消去されたメンバーがデックの最後(先頭または最後)にある場合を除き、すべてのイテレータと参照は無効化されます(その場合、イテレータと消去されたメンバーへの参照のみが無効化されます)[23.2.1.3/4]list
: 消去された要素へのイテレータと参照のみが無効化される [23.2.2.3/3]
連想コンテナ
[multi]{set,map}
: 消去された要素へのイテレータと参照のみが無効化される [23.1.2/8]
コンテナアダプタ
stack
: 基になるコンテナから継承queue
: 基になるコンテナから継承priority_queue
: 基になるコンテナから継承
サイズ変更
vector
: 挿入/消去と同様 [23.2.4.2/6]deque
: 挿入/消去と同様 [23.2.1.2/1]list
: 挿入/消去と同様 [23.2.2.2/1]
注1
別途指定されない限り(明示的に、または他の関数に基づいて関数を定義することによって)、コンテナ メンバー関数を呼び出したり、コンテナをライブラリ関数の引数として渡したりしても、そのコンテナ内のオブジェクトへの反復子が無効になったり、そのコンテナ内のオブジェクトの値が変更されたりすることはありません。[23.1/11]
注2
C++2003では、「end」イテレータが上記のルールに従うかどうかは明確ではありません。; いずれにせよ、そうであると想定する必要があります (実際にはそうなります)。
注3
ポインタの無効化のルールは参照の無効化のルールと同じです。