Quel est l'avantage du multi-table sur la carte de vecteurs?
Je ne comprends pas pourquoi multimap existe que si nous pouvons créer une carte de vecteurs ou de carte de jeux.
Pour moi, les seules différences sont:
- à l'aide de
equal_range
dans multimap pour obtenir des éléments de clé et la carte de vecteurs nous utilisons simplement[]
opérateur et ont vecteur d'éléments. - à l'aide de
multimap.insert(make_pair(key,value))
dans multimap pour ajouter des éléments etmap_of_vectors[key].push_back(value)
dans la carte de vecteurs.
Alors pourquoi utiliser multimap? Pour moi, c'est mieux d'avoir un vecteur de deux itérateurs pour obtenir toutes les valeurs d'une clé.
Cette question s'applique aussi à unordered_map de vecteurs et unordered_multimap.
- Je dois avouer que je n'ai jamais vraiment compris le but de
multimap
:/ - J'ai peu de retard dans la question, mais aussi multimap consomme beaucoup plus de mémoire que la carte de vecteurs en raison du supplément de pointeurs. La seule raison pour laquelle je préfère les utiliser si je veux garder la clé de chaque élément (faire
push_back
vous ne gardez pas) - Multimap est si grande que non seulement vous voulez garder une trace de dupliquer des clés de différentes valeurs, mais vous souhaitez également supprimer toutes les paires clé/valeur à une notification de moments. Une carte de vecteurs n'est pas adapté pour ça, et même si vous pouvez utiliser une carte de listes, il est plus pratique d'utiliser une multimap.
- Alors que je vois votre point de vue (et je n'ai pas tendance à utiliser multimap), à propos de la même chose peut être dit à propos de
map<K, V>
vsset<pair<K, V>, cmp_first<K, V>>
où cmp_first compare les.first
membre. - carte de jeux: stackoverflow.com/questions/8602068/...
Vous devez vous connecter pour publier un commentaire.
Je dirais que cela dépend si toutes les valeurs avec la même clé ont une relation que vous souhaitez aborder.
Ainsi, par exemple, allez-vous souvent au travers de tous les éléments avec la touche X, ou de les transmettre à une fonction, et ainsi de suite? Il est alors plus pratique d'avoir dans leur récipient séparé, que vous pouvez directement l'adresse.
Toutefois, si vous avez simplement une collection d'éléments, qui peuvent partager la même valeur de clé, ou pas, pourquoi utiliser des vecteurs entre les deux? C'est plus pratique pour courir à travers la multimap avec les itérateurs que d'avoir un for imbriquées-boucle pour la carte, vecteur cas.
Une autre façon de voir les choses: Si plusieurs entrées par clé est très commun, votre structure est plus efficace dans la carte, vecteur de cas. Si ils n'arrivent, c'est le contraire.
Il y a beaucoup de différences importantes entre
multimap<x, y>
etmap<x, vector<y>>
Une fois que vous avait inséré une valeur dans multimap, vous savez que l'itérateur resterait
valide jusqu'à ce que vous l'enlever, et c'est très fort de la propriété, vous ne pouvez pas le faire avec la carte de vecteurs.
L'itérateur reste valide jusqu'à ce qu'elle est effacée de la carte, tandis que dans le second cas,
il serait invalidé chaque fois que vous ajoutez une nouvelle entrée pour le vecteur.
Également noter que
map<x, vector<y>>
peut avoir une valeur vide set avec clé existante, tout en multimap ne pas.Ces différentes choses qui se comportent différemment.
Et pour être honnête je m'ennuie de multimap, dans certaines langues, qui ne sont pas dans leur bibliothèque.