std :: multimap <key、value>とstd :: map <key、std :: set <value >>の違いは何ですか


回答:


51

マルチマップには、キーと値の両方が複数回出現する可能性がある(key、value)のペアが格納されます。

map<key, set<value>>のみ、特定のキーの後にそれぞれの値を格納します。そのためには、キーだけでなく、値を比較できる必要があります。

等しいと比較する値が等しいかどうか、またはとにかくそれらを別々に保存したいかどうかは、アプリケーションによって異なります。おそらく、それらには異なるフィールドが含まれていますが、セットの比較には参加していません。


5
したがって、std :: multimap <key、value>はstd :: map <key、std :: multiset <value >>に似ていますが、両者の違いは、後者の値がソートされることです。そうですか?
大宝剑2011

2
いいえ、std::multimap<key, value>同じキーを複数回表示できますstd::map<key, whatever>が、の一意性が必要ですkey
Yixing Liu

74

Astd::mapは連想コンテナであり、タイプ値に一意のキーを関連付けることができます。例えば、

void someFunction()
{
    typedef std::map<std::string, int> MapType;
    MapType myMap;

    // insertion
    myMap.insert(MapType::value_type("test", 42));
    myMap.insert(MapType::value_type("other-test", 0));

    // search
    auto it = myMap.find("test");
    if (it != myMap.end())
        std::cout << "value for " << it->first << " is " << it->second << std::endl;
    else
        std::cout << "value not found" << std::endl;
}

A std::multimapはと同じですstd::mapが、キーはもう一意ではありません。したがって、1つの固有のアイテムを見つけるだけでなく、さまざまなアイテムを見つけることができます。例えば、

void someFunction()
{
    typedef std::multimap<std::string, int> MapType;
    MapType myMap;

    // insertion
    myMap.insert(MapType::value_type("test", 42));
    myMap.insert(MapType::value_type("test", 45));
    myMap.insert(MapType::value_type("other-test", 0));

    // search
    std::pair<auto first, auto second> range = myMap.equal_range("test");
    for (auto it = range.first; it != range.second; ++it)
        std::cout << "value for " << it->first << " can be " << it->second << std::endl;
}

std::set以下のようなものですstd::mapが、それは値に関連付けられたキーを格納していません。キータイプのみを保存し、セット内で一意であることを保証します。

あなたも持っています std::multiset、それは同じパターンに従います。

これらのコンテナはすべて、find / equal_rangeを使用してO(log(n))アクセスを提供します。


6
マルチマップ関数では、この行std::pair<auto first, auto second> range = myMap.equal_range("test");は機能しませんerror: 'auto' not allowed in template argumentconst auto range = myMap.equal_range("test")代わりに使用してください。
vancexu 2014年

2
mapType?4行目のMapTypeではないでしょうか。
lolololol ol 2016

誰が最初かはわかり
idclev 4630358 1818年

1
ああ、cppbuzzはStackOverflowをスクレイピングしているのか?、私はまだc ++で毎日コーディングしていた数年前に、この回答を自分で書いた。そして、実際にタイプミスライン4があり、おかげで@lololololol
typedefを

1
(そしてそれらのコピー/貼り付けは失敗しました、それらはテンプレートstd :: map宣言にタイプさえ表示しません:std :: map <std :: string、int>)
typedef 2018年

13
map::insert

mapコンテナではキー値の重複が許可されていないため、挿入操作では、挿入された各要素について、同じキー値を持つ別の要素がコンテナにすでに存在するかどうかがチェックされます。存在する場合、要素は挿入されず、マップされた値は変更されません。

一方

multimap::insert 

同じキーでいくつでもアイテムを挿入できます。

http://www.cplusplus.com/reference/stl/map/
http://www.cplusplus.com/reference/stl/multimap/


違いとそれが内部でどのように機能するかについての良いリンク。リンク
Rndp13 2015年

10

後者では、値を(経由operator<または比較関数を介して)順序付けできる必要がありますが、前者はそうではありません。


operator <はマップでもマルチマップでも同じように機能するように見えますか?en.cppreference.com/w/cpp/container/map/operator_cmp
johnbakers

はい、しかし私の答えは値の順序に言及していました。T順序付けされていないタイプがあるとします。これを使用してを作成するstd::multimap<U, T>ことはできますが、を作成するために使用することはできませんstd::map<U, std::set<T> >
ビョルンPollex
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.