web-dev-qa-db-fra.com

Quelle est la différence entre std :: multimap <clé, valeur> et std :: map <clé, std :: set <valeur>>

J'ai trouvé qu'ils ont une clé et plusieurs valeurs, ce qui est unique.

75
大宝剑

La carte multiple stocke des paires de (clé, valeur) où clé et valeur peuvent apparaître plusieurs fois.

Le map<key, set<value>> ne stockera chaque valeur qu'une fois pour une clé spécifique. Pour ce faire, il devra être capable de comparer les valeurs, pas seulement les clés.

Cela dépend de votre application si les valeurs qui se comparent sont équivalentes ou si vous souhaitez néanmoins les stocker séparément. Peut-être qu'ils contiennent des champs différents mais ne participent pas à la comparaison de l'ensemble.

47
Bo Persson

UNE std::map est un conteneur associatif, qui vous permet d’avoir une clé unique associée à votre valeur de type. Par exemple,

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

UNE std::multimap est égal à un std::map, mais vos clés ne sont plus uniques. Par conséquent, vous pouvez trouver une gamme d’articles plutôt que de trouver un article unique. Par exemple,

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

Le std::set est comme un std::map, mais il ne stocke pas une clé associée à une valeur. Il ne stocke que le type de clé et vous assure qu'il est unique dans l'ensemble.

Vous avez aussi le std::multiset, qui suit le même schéma.

Tous ces conteneurs fournissent un accès O(log(n)) avec leur paramètre find/equal_range.

69
typedef
map::insert

Étant donné que map les conteneurs n'autorisent pas les valeurs de clé en double, l'opération d'insertion vérifie pour chaque élément inséré si un autre élément existe déjà dans le conteneur avec la même valeur de clé, le cas échéant, l'élément n'est pas inséré et sa valeur mappée est pas changé en aucune façon.

d'autre part

multimap::insert 

peut insérer n'importe quel nombre d'éléments avec la même clé.

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

13
Luka Rahne

Ce dernier nécessite que les valeurs puissent être ordonnées (soit via operator< ou une fonction de comparaison), le premier ne le fait pas.

10
Björn Pollex