Différence entre les std::list<std::pair>, et std::map en C++ stl
Pouvez-vous me dire la différence entre les std::list<std::pair>, et std::map. Puis-je utiliser la méthode find sur la liste?
Merci.
-- Clarification
Question modifié afin d'être plus clair.
- Votre titre ne correspond pas au contenu de votre question.
Vous devez vous connecter pour publier un commentaire.
std::map<X, Y>
:X
s) defind()
méthode (O(log n)
) qui trouve la paire Clé-Valeur par Clémap[key]
, qui est aussi rapidestd::list<std::pair<X, Y> >
:X
s etY
s. Ils restent dans l'ordre que vous mettez dans.list
estO(N)
(aucune méthode particulière)splice
méthode.std::pair
std::pair
est basé sur un modèle n-uplet de la structure limitée à 2 éléments, appelé première et la deuxième:std::pair
est utilisé comme un "conteneur générique" par le TSL (et le code) pour agréger les deux valeurs en même temps sans avoir à redéfinir encore un autrestruct
.std::map
std::map
est basé sur un modèle conteneur associatif, associe dans ce cas des clés et des valeurs. La méthode la plus simple (mais pas la plus efficace) exemple :std::pair
etstd::map
Note: C'était la réponse à l'originale, inédite question.
La
std::map
fonctions des besoins de retour des itérateurs pour les clés et valeurs dans le même temps, pour rester efficace... Donc, la solution évidente est de retour itérateurs de paires:std::list<std::pair<A,B> >
etstd::map<A,B>
Remarque: les modifications apportées après l'édition de la question.
Donc, au premier abord, une carte de paires et d'une liste de paires semblent les mêmes. Mais ce n'est pas le cas:
La carte est intrinsèquement commandé par le foncteur fourni, alors que la liste va garder les paires de [A,B] vers la droite endroit où vous les placez. Cela rend l'insertion O(log n) pour la carte, tandis que les premières d'insertion à l'intérieur d'une liste est une constante de la complexité (la recherche de l'emplacement d'insertion c'est un autre problème).
Vous pouvez simuler un peu le comportement d'une carte à l'aide d'une liste de paires, mais notez que la carte est généralement mis en œuvre comme un arbre d'éléments, tandis que la liste est une liste chaînée d'éléments. Ainsi, l'algorithme comme la dichotomie travaillera beaucoup plus vite, à une carte que dans une liste.
Ainsi, la recherche d'un élément dans une carte est O(log n), tandis que dans une liste non ordonnée, il est O(n). Et si la liste est ordonnée, et que vous souhaitez utiliser dichotomie, vous n'aurez pas attendu d'augmentation des performances, comme la traversée de la liste des éléments est effectuée élément par élément, de toute façon.
(Dans un projet, j'ai travaillé sur il y a un an, nous avons remplacé une liste des produits commandés par une série de des articles commandés, et il a contribué à la performance. L'ensemble ayant la même arborescence que celle de la carte, je suppose que le même boost s'appliquerait ici)
(Édité après clarification)
std::map
est optimisé pour la recherche rapide. Il a son proprefind
méthode qui utilise sa structure interne afin de fournir de bonnes performances. En général, il ne fera que inspecterlog(N)
touches, où N est le nombre d'éléments dans la carte.std::list<std::pair>
est une simple liste chaînée, et donc ne supporte élément par élément de la traversée. Vous pourrait utiliser les séparerstd::find
algorithme, oustd::find_if
avec un prédicat qui examine seulement lafirst
membre pour mieux correspondre à la sémantique destd::map::find
, mais ce serait très lente. En fait, il faut regarder chaque paire dans la liste en cas de panne de recherche, et sur la moitié de la moyenne pour la réussite de tout un.std:pair
détient exactement deux objets.std:map
stocker une collection d'objets liés.Vous ne pouvez pas utiliser find() sur la paire, car il n'y a rien à trouver. L'objet que vous voulez est soit
pair.First
oupair.Second
Mise à JOUR:
En supposant que vous avez voulu dire la différence entre
map<>
etlist<pair<> >
: la Carte doit être mis en œuvre pour la recherche rapide sur lekey
membre.list
a juste une simple liste linéaire. À la recherche d'un élément dans une liste nécessite l'exécution par le biais de l'ensemble de la liste. Cependant, std::find() permet de travailler sur les deux.STL cartes sont des tableaux associatifs sont généralement mis en oeuvre en tant que hashmaps à l'intérieur. Si vous souhaitez obtenir une itération sur un STL carte il va revenir STL paire.
Je vous suggère de le googler et de la lecture complète de la STL l'API de référence depuis STL (à l'exception de stocker des valeurs booléennes dans des vecteurs et autres bizarreries comme ça) met en œuvre un grand nombre de données de la structure de la fonctionnalité que vous souhaitez utiliser dans n'importe quel programme sans avoir à réinventer la roue.
map
s ne sont pas mises en œuvre par hashmaps, mais le rouge-noir (ou comme) des arbres.std::pair est juste pour le regroupement exactement 2 objets (par exemple, "coordonnées sur une page" est formée de X et de Y).
std::map est une correspondance entre un ensemble d'objets à un autre.
Il n'y a pas de point d'essayer d'utiliser une méthode de recherche sur une paire, comme ce qui est le point de trouver quelque chose dans une liste de deux choses dont vous savez l'ordre, même si cette méthode existe dans une paire de la classe dont il ne fait pas.
Toutefois, vous POUVEZ utiliser std::pair en tant que valeur de la carte si c'est ce que vous voulez.
Carte peut donner le meilleur temps de recherche dans la plage de O(log n),
whilw liste peut avoir le temps de recherche de O(n).