イテレータが指す要素を消去し、同じイテレータを 1 行で進めて次の要素に移動することはできますか?
set<int>::iterator it = S.begin();
while (it != S.end()) {
if (shouldBeRemoved(*it)) {
S.erase(it++); // is this line valid?
} else {
++it;
}
}
イテレータが指す要素を消去し、同じイテレータを 1 行で進めて次の要素に移動することはできますか?
はい、有効です。
根拠:
it++次の要素を参照するようにインクリメントitしますが、元の値のコピーを生成します。したがって、が呼び出さitれたときに削除される要素を参照しません。erase()またstd::set、消去された要素へのイテレータのみが無効化される場合。#1
このコード例は、反復子が参照している要素を削除する定型コードと考えることができます。
参考文献:
の場合std::set、
#1 C++03 標準 23.1.2/8:
消去された要素への反復子と参照のみが無効化されます
はい、有効です。式it++は関数が呼び出される前に完全に評価されるため、関数は の前の値を受け取りますがit、削除 (および無効化) されるまでに、反復子は既にインクリメントされています。