web-dev-qa-db-ja.com

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

それらには、1つのキーと一意の複数の値があることがわかりました。

75
大宝剑

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

map<key, set<value>>は、特定のキーに対して各値を1回だけ保存します。そのためには、キーだけでなく値を比較できる必要があります。

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

47
Bo Persson

std::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;
}

std::multimapstd::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::setstd::mapに似ていますが、値に関連付けられたキーを格納していません。キータイプのみを保存し、セット内で一意であることを保証します。

同じパターンに従うstd::multisetもあります。

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

69
typedef
map::insert

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

一方

multimap::insert 

同じキーで任意の数のアイテムを挿入できます。

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

13
Luka Rahne

後者では、値を並べ替えることができます(operator<または比較関数)、前者はそうではありません。

10
Björn Pollex