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

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

    Le multimap stocke les paires de (clé, valeur) où la clé et la valeur peuvent apparaître plusieurs fois.

    La map> ne stockera chaque valeur qu’une seule fois pour une clé spécifique. Pour ce faire, il faudra pouvoir comparer les valeurs, pas seulement les clés.

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

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

    Un 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 au lieu de simplement trouver un object unique. Par exemple,

     void someFunction() { typedef std::multimap 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 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 de clé associée à une valeur. Il stocke uniquement le type de clé et vous assure qu'il est unique dans l'ensemble.

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

    Tous ces conteneurs fournissent un access O (log (n)) avec leur find / equal_range.

     map::insert 

    Étant donné que les conteneurs de map ne permettent pas les valeurs de clé en double, l’opération d’insertion vérifie pour chaque élément inséré s’il existe déjà un autre élément dans le conteneur avec la même valeur de clé, si l’élément n’est pas inséré et sa valeur mappée .

    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/

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