1

現在、一連のイテレータをセットから消去しようとしていますが、std::set::erase(iterator) はイテレータ (次のイテレータ) を返す必要があるため、GCC の標準ライブラリは壊れているようですが、GCC では void を返します(どれが標準?)

とにかく私は書きたい:

myIter = mySet.erase(myIter);

しかし、GCCはそれを好まない...では、代わりにこれを書いても安全ですか?

mySet.erase(myIter++);

編集:はい、私は mySet.end(); に対してチェックしています。

4

2 に答える 2

9

で問題ありません

mySet.erase(myIter++);

操作の順序は明確に定義されています。myIterがmyTempIterにコピーされ、myIterがインクリメントされてから、myTempIterがeraseメソッドに渡されます。

グレッグとマークの場合:いいえ、operator++がeraseの呼び出し後に操作を実行する方法はありません。定義上、erase()はoperator++が戻った後に呼び出されます。

于 2008-10-02T07:45:02.557 に答える
3

まず、標準を読み直すと、set::eraseメソッドのプロトタイプが次のようになっていることがわかります。

void erase(iterator position);

ただし、要素を消去しても他の要素のイテレータに影響を与えないため、STLの連想コンテナは「安定」しています。これは、次の行が有効であることを意味します。

iterator to_erase = myIter++;
mySet.erase(to_erase);
// Now myIter is still on the next element
于 2008-10-02T07:51:06.757 に答える