考慮する:
#include <map>
int main()
{
std::map< int, int > m;
m[ 0 ] = 0;
m[ 1 ] = 1;
m.erase( 0 ); // ok
m.erase( 2 ); // no-op
m.erase( m.find( 2 ) ); // boom!
}
(タイトルでは end() イテレータの消去について説明していますが、存在しないキーに対しては find は end() を返します。)
存在しないキーを消去するのは問題ないのに、end() を消去するとエラーになるのはなぜですか。標準ではこれについて明示的に言及されていませんでした。
これを VS2005 (デバッグ構成で例外をスロー) と GCC 4.0.1 (CPU 100%) で試しました。実装に依存しますか?
ありがとう。
ベストアンサー1
の場合erase(key)
、標準では値キーを持つすべての要素が削除されると規定されています。もちろん、そのような値が存在しない場合もあります。
erase(it)
(it
は)の場合std::map::iterator
、標準ではそれが指す要素は削除されるとされていますが、残念ながら、それがend()
有効な要素を指していない場合、未定義の動作他のマップ操作で使用する場合と同様に、土地を移動しますend()
。詳細については、セクション 23.1.2 を参照してください。