0

std::unordered_set::erase() には 3 つのオーバーロードがあります: 参照を取得するものでは、「無効な」値、つまりセットに存在しない値を渡すと、単純に erase() が 0 を返します。他の2つの過負荷?

C++ 11 標準は、この場合に erase() が何をすべきかを述べていますか、それともコンパイラに依存していますか? end() または未定義の動作を返すことになっていますか?

仕様、cppreference.com、cplusplus.com で答えが見つかりませんでした。IBM のサイトでは、操作後に要素が残っていない場合は end() を返すと書かれていますが、イテレータが無効なために操作自体が失敗した場合はどうなりますか?

そして、一般に、STL コンテナーの erase() メソッドは、これらの場合に未定義の動作をするだけですか? (そのため、erase() に何かを渡す前にイテレータをチェックするか、失敗した場合は単純に 0 を返す value_type 参照を取る unordered_set::erase() オーバーロードを使用する必要があります)

4

2 に答える 2

4

setで発生しない値を削除しようとすることと、無効なイテレータから消去しようとすることには、大きな意味上の違いがあります。

無効なイテレータを使用しようとすると、未定義の動作になり、正常に終了しません。

無効なイテレータを消去したい場合に考えている特定のユースケースはありますか?

于 2013-03-06T13:23:53.070 に答える
2

これらは 2 つの完全に異なるケースです。「無効な値」はありません。セットに存在しない値は引き続き有効です。したがって、セットに含まれていない有効な値を渡すと、0 が返されます。要素は消去されていません。

他のオーバーロードは完全に異なります。標準では、消去メソッドに渡されるイテレータは、それぞれ「有効で参照解除可能」および「有効なイテレータ範囲」である必要があります。それ以外の場合、動作は未定義です。

そうです、イテレータは有効でなければなりません。ただし、反復子がプログラムで有効かどうかを確認することはできません。プログラム ロジックから有効であることを確認する必要があります。

于 2013-03-06T13:33:39.723 に答える