map.erase( map.end() )? 質問する

map.erase( map.end() )? 質問する

考慮する:

#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 を参照してください。

おすすめ記事