2017-04-11 47 views
-5

私はC++を初めてお使いです。最近、この言語を実験しています。C++のマップの順序は?

mapでいくつかの基本的な繰り返しを開始しました。

map<string, int> persons = {{"Lily", 14}, {"John", 45}}; 

for (const auto &p : persons) { 

    cout << p.first << " is " << p.second << " years old." << endl; 
} 

常に返します:どんなに者の順序が何であるかを

John is 45 years old. 
Lily is 14 years old. 

(例えば、私はリリー&ジョンを切り替える場合)。私は次のコードがあることがわかった何

map内に注文はありますか?

+1

http://en.cppreference.com/w/cpp/container/map – juanchopanza

+1

参照を確認すると、知る必要があることがわかります。http://en.cppreference.com/w/cpp/container/map – NathanOliver

+0

'map'の目的はキーを値にマップすることです。同じ順序で並んでいるペアのリストが必要な場合は、 'vector >' –

答えて

5

はい

std::map

(ならびにstd::set)は、そのComparator、その格納されたキーのoperator <のオーバーロードを呼び出しstd::lessデフォルトに従って順序付けされます。

したがって、std::strings are ordered lexicographically

+0

私には明らかですね!説明をありがとう。 M.Mがコメントで言ったように、代わりにベクトルを使用する方が良いでしょうか? (もし私が順序付き連想配列を持っていれば) –

+0

@MelvinKoopmans 'std :: vector'はそれ自体では順序を保つことはできません。ただし、挿入するときに手動でソートすることはできます。 'std :: map'は通常、真ん中に向かって挿入し、そのキーで単一の要素を取り出す方が高速ですが、ベクトルはその要素を順番に横断する方が高速です。あなたがパフォーマンスを必要とするなら、両方とも試してみてください。 – Quentin

4

はい、注文はmapです。

具体的には、std::mapは、キーで項目を注文します。この場合、キーとしてstd::stringを使用しているため、キーは文字列を比較することによって順序付けられます。 JはアルファベットのLの前に来るので、マップの最初の順番に並べられます。

異なる順序を指定する独自の比較ルーチンを関数または関数オブジェクトとして提供できます(しかし、それでも "厳密な弱い順序"の基準を満たす必要があります)。例)A<BおよびB<Cは、A<Cを意味します)。