9

イテレータが指す要素を消去し、同じイテレータを 1 行で進めて次の要素に移動することはできますか?

set<int>::iterator it = S.begin();
while (it != S.end()) {
    if (shouldBeRemoved(*it)) {
        S.erase(it++); // is this line valid?
    } else {
        ++it;
    }
}
4

2 に答える 2

5

イテレータが指す要素を消去し、同じイテレータを 1 行で進めて次の要素に移動することはできますか?

はい、有効です。


根拠:

it++次の要素を参照するようにインクリメントitしますが、元の値のコピーを生成します。したがって、が呼び出さitれたときに削除される要素を参照しません。erase()またstd::set、消去された要素へのイテレータのみが無効化される場合。#1

このコード例は、反復子が参照している要素を削除する定型コードと考えることができます。


参考文献:

の場合std::set
#1 C++03 標準 23.1.2/8:

消去された要素への反復子と参照のみが無効化されます

于 2012-04-05T18:03:45.097 に答える
2

はい、有効です。式it++は関数が呼び出される前に完全に評価されるため、関数は の前の値を受け取りますがit、削除 (および無効化) されるまでに、反復子は既にインクリメントされています。

于 2012-04-05T18:04:00.237 に答える