it-swarm-eu.dev

Quel est l'avantage du multimap sur la carte des vecteurs?

Je ne comprends pas pourquoi le multimap existe si nous pouvons créer une carte de vecteurs ou une carte d'ensembles. Pour moi, seules les différences sont:

  • en utilisant equal_range en multimap pour obtenir des éléments d'une clé et dans une carte de vecteurs, nous utilisons simplement l'opérateur [] et avons 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) dans la carte des vecteurs.

Alors pourquoi utiliser le multimap? Pour moi, il vaut mieux avoir un vecteur que deux itérateurs pour obtenir toutes les valeurs d'une clé.

Cette question s'applique également à unordered_map de vecteurs et à unordered_multimap.

71
Mariusz Pawelski

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, 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 juste une collection d'éléments, qui peuvent partager la même valeur de clé, ou non, pourquoi utiliser des vecteurs entre les deux? Il est plus pratique de parcourir le multimap avec des itérateurs que d'avoir une boucle for imbriquée pour la carte, cas vectoriel.

Une autre façon de voir les choses: si plusieurs entrées par clé sont très courantes, votre structure est plus efficace dans la carte, cas vecteur. S'ils se produisent rarement, c'est le contraire.

50
ypnos

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 resterait 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, tandis que dans le deuxième cas, il serait invalidé chaque fois que vous ajoutez une nouvelle entrée au vecteur.

Notez également que map<x, vector<y>> peut avoir une valeur vide définie avec la clé existante, contrairement à multimap.

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

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

49
Artyom