J'ai trouvé qu'ils ont une clé et plusieurs valeurs, ce qui est unique.
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.
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.
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/
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.