1. ホーム
  2. c++

[解決済み] std::mapの反復処理の順番は既知(規格で保証されている)ですか?

2022-04-28 17:47:30

質問

つまり、私たちが知っているのは std::map の要素はキーにしたがってソートされます。そこで、キーが整数であるとします。もし私が std::map::begin() から std::map::end() を使用しています。 for この規格では、キーを持つ要素を昇順に並べ、結果的に反復することを保証しているのでしょうか?


std::map<int, int> map_;
map_[1] = 2;
map_[2] = 3;
map_[3] = 4;
for( std::map<int, int>::iterator iter = map_.begin();
     iter != map_.end();
     ++iter )
{
    std::cout << iter->second;
}

これは印刷が保証されていますか? 234 それとも実装で決まっているのでしょうか?


現実的な理由:私は std::mapint キーになります。非常に稀なケースですが、キーが具体的な int の値を指定します。そう、それは次のように聞こえます。 std::vector が良いのでしょうが、私の "very rare situations" に注目してください。


EDIT : 私は std::map はソートされています。(ここの回答のほとんどは)それを指摘する必要はありません。私は私の質問にさえそれを書きました。

コンテナで反復処理するときのイテレータと順番について質問したのです。回答してくれた@Kerrek SBに感謝します。

どのように解決するのですか?

はい、保証します。しかも *begin() は、最小のものを与え *rbegin() 比較演算子によって決定される最大の要素と、2つのキー値 ab という表現に対して !compare(a,b) && !compare(b,a) が真であれば、等しいとみなされます。デフォルトの比較関数は std::less<K> .

順序は、2つのキーが同じであることを判定し(上記のルールによる)、効率的な検索(基本的には要素数の対数的な複雑さを持つ二項検索)を実行するために使用されるため、幸運なボーナス機能ではなく、むしろデータ構造の基本的側面である。