引数として使用する場合、内部のイテレータを増やすことは安全ですか?
質問
現在、セットからイテレータのシーケンスを消去しようとしていますが、GCCの標準ライブラリは壊れているようです。std:: set :: erase(iterator)がイテレータ(次のイテレータ)を返す必要があるためvoidを返します(これは標準ですか?)
とにかく書きたい:
myIter = mySet.erase(myIter);
しかし、GCCは気に入らない... 代わりにこれを書いても安全ですか?
mySet.erase(myIter++);
編集:はい、mySet.end()に対してチェックしています
解決
問題ありません
mySet.erase(myIter++);
操作の順序は明確に定義されています。myIterがmyTempIterにコピーされ、myIterがインクリメントされ、myTempIterがeraseメソッドに渡されます。
Greg and Markの場合:いいえ、operator ++がeraseの呼び出し後に操作を実行する方法はありません。定義上、erase()はoperator ++が返された後に呼び出されます。
他のヒント
最初に、標準を再読すると、set :: eraseメソッドのプロトタイプが次のようになっていることがわかります:
void erase(iterator position);
ただし、要素を消去しても他の要素の反復子には影響しないため、STLの連想コンテナは「安定」しています。これは、次の行が有効であることを意味します。
iterator to_erase = myIter++;
mySet.erase(to_erase);
// Now myIter is still on the next element
所属していません StackOverflow