2012-06-30 4 views
9

はSTLマップが注文されていますか?C++のstd :: map <文字列、文字列>は順序づけられていますか?

具体的には、std :: mapが注文されているかどうかを知る必要があります。したがって、最初の挿入文字列を最初に反復処理します。

以下、A、C、Bを一貫して繰り返しますか?

std::map<string,string> str_map; 

str_map.insert(std::make_pair("A","Data")); 
str_map.insert(std::make_pair("C","Data")); 
str_map.insert(std::make_pair("B","Data")); 
+4

はい、実際には独自の比較関数を渡すことができますので、必要に応じて並べ替えることができます。 http://www.cplusplus.com/reference/stl/map/ – leetNightshade

+2

CodingQuant:実際にあなたの例はあまり良くありません。なぜなら、「順序付け」という2つの意味を区別しないからです。挿入順序と辞書順です。 std :: mapは、挿入命令ではなく、辞書式の順序を保持します。 –

+3

@j_random_hacker:賢明であるために、std :: mapは、比較述語が辞書編集の比較に基づいている場合にのみ、辞書編集の順序を保持します。 –

答えて

25

はSTLマップを注文していますか?

はい、std::map<K,V>は、デフォルトでは、オブジェクトを比較するためにstd::less<K>を使用して、キー、Kに基づいて順序付けされます。

したがって、繰り返し処理すると、最初の挿入文字列を最初に反復処理しますか?

いいえ。要素を挿入した順序ではなく、ソート順に基づいて繰り返します。 std::stringの場合、辞書順(アルファベット順)にソートされます。

挿入順序に基づいて反復処理を行う場合は、std::vectorstd::listなどのシーケンスコンテナを使用する方がよいでしょう。

+0

ありがとう - それはアルファベットをソートしますか?私はBの前にCを入れる質問を更新しました。ありがとうございました – CodingHero

+0

@CodingQuant:それに応じて回答が更新されました。 –

4

std::mapは、指定された型のoperator<のいずれかを使用してソートされます。または、コンストラクタに引数として指定されている場合はカスタム比較関数/ファンクタを使用してソートされます。

地図上を反復すると、最初に挿入したアイテムは最初に挿入されたアイテムにはなりません。最初に挿入したアイテムは最初にアルファベット順に表示されます。

「A」が挿入した最初のキーであり、最初のものがアルファベット順であるため、違いがないサンプルコードでももちろんです。

+1

デフォルトでは、std :: mapは 'std :: less 'を使用します。これはどのように動作するのですか?Key型に依存しますが、通常のSTL型では通常は 'operator <' –