79 votes

Quel est l'avantage de la multimap par rapport à la carte de vecteurs ?

Je ne comprends pas pourquoi multimap existe si on peut créer des cartes de vecteurs ou des cartes d'ensembles. Pour moi, les seules différences sont :

  • en utilisant equal_range en multimap pour obtenir les éléments d'une clé et en map de vecteurs on utilise simplement [] et ont un vecteur d'éléments.
  • en utilisant multimap.insert(make_pair(key,value)) dans multimap pour ajouter des éléments et map_of_vectors[key].push_back(value) en carte de vecteurs.

Alors pourquoi utiliser multimap ? Pour moi, il est préférable d'avoir un vecteur que deux itérateurs pour obtenir toutes les valeurs d'une clé.

Cette question s'applique également à unordered_map of vectors et unordered_multimap.

11 votes

Je dois admettre que je n'ai jamais vraiment compris le but de multimap :/

0 votes

J'interviens un peu tard dans la question, mais les cartes multiples consomment aussi beaucoup plus de mémoire que les cartes de vecteurs en raison des pointeurs supplémentaires. La seule raison pour laquelle je les utiliserais est si je veux garder la clé de chaque élément (en faisant push_back vous ne le garderez pas)

0 votes

Multimap est idéal si vous souhaitez non seulement garder la trace des clés dupliquées de valeurs différentes, mais aussi supprimer toute paire clé/valeur à tout moment. Une carte de vecteurs ne convient pas pour cela, et bien que vous puissiez utiliser une carte de listes, il est plus pratique d'utiliser une multimap.

62voto

ypnos Points 21940

Je dirais que cela dépend si toutes les valeurs avec la même clé ont une relation que vous voulez aborder.

Ainsi, par exemple, parcourez-vous souvent tous les éléments avec la touche X, ou les passez-vous à une fonction, et ainsi de suite ? Il est alors plus pratique de les avoir déjà dans leur conteneur séparé, auquel vous pouvez vous adresser directement.

Cependant, 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 ? Il est plus pratique de parcourir la multimap avec des itérateurs que d'avoir un for-loop imbriqué pour le cas map, vector.

Une autre façon de voir les choses : Si les entrées multiples par clé sont très courantes, votre structure est plus efficace dans le cas de la carte, du vecteur. Si elles ne se produisent que rarement, c'est le contraire.

3 votes

Merci. Votre réponse et celle d'Artyom m'ont montré un peu plus de différences. Cependant, je ne pense toujours pas que la multimap soit aussi utile dans la vie réelle que la carte de vecteurs. Mais c'est mon opinion personnelle ;)

0 votes

L'extrait pratique que je tire de cette réponse est le suivant : avec multimap vous pouvez avoir une gamme d'itérateurs couvrant l'ensemble de la structure, mais de tels itérateurs début/fin itéreront des paires de clés et de valeurs (ce qui peut ne pas être pratique). Avec map<...,vector> L'itération de la structure entière est plus complexe, mais vous pouvez avoir des itérateurs de début/fin de séquence égale de valeurs justes.

58voto

Artyom Points 17387

Il existe de nombreuses différences importantes entre multimap<x, y> et map<x, vector<y>>

Une fois que vous avez inséré une valeur dans multimap vous savez que l'itérateur restera valide jusqu'à ce que vous le supprimiez. valide jusqu'à ce que vous le supprimiez et c'est une propriété très forte, vous ne pouvez pas l'avoir avec une carte de vecteurs.

multimap<x,y>::iterator p=mymap.insert(make_pair(a,b));

L'itérateur reste valide jusqu'à ce qu'il soit effacé de la carte, alors que dans le second cas, il serait invalidé à chaque fois que l'on ajoute une nouvelle entrée au vecteur.

Notez également que map<x, vector<y>> peut avoir un ensemble de valeurs vides avec une clé existante, alors que multimap ne le fait pas.

Ce sont des choses différentes qui se comportent différemment.

Et pour être honnête, multimap me manque dans certaines langues qui ne le fournissent pas dans leur bibliothèque.

3 votes

Bien que l'angle de l'invalidation des itérateurs soit intéressant, votre déclaration "il serait invalidé chaque chaque fois que vous ajoutez une nouvelle entrée au vecteur." n'est pas vrai en pratique. L'itérateur n'est invalidé que lorsque le vecteur est redimensionné, sinon il ne l'est pas... cependant, comme vous ne savez pas/ne vous souciez pas de savoir quand le vecteur est redimensionné, nous ne devrions pas concevoir notre code autour du redimensionnement et simplement supposez les itérateurs sont invalidés lors de l'insertion !

0 votes

@Nawaz envisage d'insérer (ajouter nouveau) et d'effacer.

2voto

Steve Townsend Points 36948

Il pourrait être utile de penser à un multimap comme un adaptateur à un map de vector s. Vous pouvez obtenir le même effet en utilisant map de vector mais c'est plus de travail - multimap vous évite de faire un travail manuel pour obtenir une itération complète de la collection, le nombre d'éléments correspondant à une clé, etc.

map de vector est une mise en œuvre possible de multimap si vous voulez.

0voto

Stephane Rolland Points 8110

Deux itérateurs ? ?? Je pense que vous avez tort.

quand j'utilise std::for_each() ou d'autres algo sur une multimap, je n'utilise qu'UNE seule gamme d'itérateurs, et c'est beaucoup plus simple que de s'occuper d'un vecteur pour chaque clé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X