イテレータが指す要素を消去し、同じイテレータを 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
、削除 (および無効化) されるまでに、反復子は既にインクリメントされています。