J'ai une question avec hash_map
et map
en C ++. Je comprends que map
c'est dans STL, mais ce hash_map
n'est pas une norme. Quelle est la différence entre les deux?
117
Ils sont mis en œuvre de manière très différente.
hash_map
( unordered_map
dans TR1 et Boost; utilisez-les à la place) utilisez une table de hachage où la clé est hachée dans un emplacement de la table et la valeur est stockée dans une liste liée à cette clé.
map
est implémenté comme un arbre de recherche binaire équilibré (généralement un arbre rouge / noir).
An unordered_map
devrait donner des performances légèrement meilleures pour accéder aux éléments connus de la collection, mais a map
aura des caractéristiques supplémentaires utiles (par exemple, il est stocké dans un ordre trié, ce qui permet une traversée du début à la fin). unordered_map
sera plus rapide lors de l'insertion et de la suppression qu'un fichier map
.
hash_map
était une extension courante fournie par de nombreuses implémentations de bibliothèques. C'est exactement pourquoi il a été renomméunordered_map
lorsqu'il a été ajouté au standard C ++ dans le cadre de TR1. map est généralement implémentée avec un arbre binaire équilibré comme un arbre rouge-noir (les implémentations varient bien sûr).hash_map
etunordered_map
sont généralement implémentés avec des tables de hachage. Ainsi l'ordre n'est pas maintenu.unordered_map
insert / delete / query sera O (1) (temps constant) où la carte sera O (log n) où n est le nombre d'éléments dans la structure de données. C'est doncunordered_map
plus rapide, et si vous ne vous souciez pas de l'ordre des articles, il faut préférermap
. Parfois, vous voulez maintenir l'ordre (ordonné par la clé) et pour celamap
serait le choix.la source
Certaines des principales différences résident dans les exigences de complexité.
A
map
nécessite duO(log(N))
temps pour les opérations d'insertion et de recherche, car il est implémenté sous la forme d'une structure de données d' arbre rouge-noir .An
unordered_map
requiert un temps «moyen» deO(1)
pour les insertions et les découvertes, mais il est autorisé à avoir un temps dans le pire des cas deO(N)
. En effet, il est implémenté à l'aide de la structure de données de table de hachage .Donc, généralement,
unordered_map
sera plus rapide, mais en fonction des touches et de la fonction de hachage que vous stockez, cela peut devenir bien pire.la source
La spécification C ++ ne dit pas exactement quel algorithme vous devez utiliser pour les conteneurs STL. Elle impose cependant certaines contraintes sur leurs performances, ce qui exclut l'utilisation de tables de hachage pour
map
et d'autres conteneurs associatifs. (Ils sont le plus souvent implémentés avec des arbres rouges / noirs.) Ces contraintes nécessitent de meilleures performances dans le pire des cas pour ces conteneurs que les tables de hachage peuvent offrir.Cependant, beaucoup de gens veulent vraiment des tables de hachage, c'est pourquoi les conteneurs associatifs STL basés sur le hachage sont une extension courante depuis des années. Par conséquent, ils ont ajouté
unordered_map
et ainsi de suite aux versions ultérieures de la norme C ++.la source
map
est généralement qu'un arbre équilibré était dû à l'utilisationoperator<()
comme moyen de déterminer l'emplacement.map
est implémenté à partir debalanced binary search tree
(généralement arb_tree
), puisque tous les membresbalanced binary search tree
sont triés, ainsi que la carte;hash_map
est implémenté à partir dehashtable
.Comme toushashtable
les membres dehash_map(unordered_map)
ne sont pas triés, les membres de ne sont pas triés.hash_map
n'est pas une bibliothèque standard C ++, mais maintenant elle a été renomméeunordered_map
(vous pouvez penser qu'elle a été renommée) et devient une bibliothèque standard C ++ depuis C ++ 11 voir cette question Différence entre hash_map et unordered_map?pour plus de détails.Ci-dessous, je vais donner une interface de base à partir du code source de la façon dont la carte à deux types est implémentée.
carte:
Le code ci-dessous est juste pour montrer que la carte est juste un wrapper d'une fonction
balanced binary search tree
, presque toute sa fonction est simplement d'invoquer labalanced binary search tree
fonction.hash_map
:hash_map
est implémenté à partir dehashtable
laquelle la structure est un peu comme ceci:Dans le code ci-dessous, je vais donner la partie principale de
hashtable
, puis je donnehash_map
.Comme
map's
seul membre estrb_tree
, lehash_map's
seul membre esthashtable
. C'est le code principal comme ci-dessous:L'image ci-dessous montre quand un hash_map a 53 buckets et insère des valeurs, c'est sa structure interne.
L'image ci-dessous montre une certaine différence entre map et hash_map (unordered_map), l'image vient de Comment choisir entre map et unordered_map? :
la source
Je ne sais pas ce que cela donne, mais hash_map prend plus de 20 secondes pour effacer () 150K clés entières non signées et valeurs flottantes. Je suis juste en train d'exécuter et de lire le code de quelqu'un d'autre.
C'est ainsi qu'il inclut hash_map.
J'ai lu ceci ici https://bytes.com/topic/c/answers/570079-perfomance-clear-vs-swap
dire que clear () est l'ordre de O (N). Cela pour moi, c'est très étrange, mais c'est comme ça.
la source