Quelle structure de données est à l'intérieur de std::map en C++?
Je suis débutant et l'apprentissage de C++
Ayant du mal à comprendre std::map concepts, parce que le code, je suis en train de jouer avec implique que le map
est un arbre de recherche, c'est à dire tous les noms des std::map objets ont *l'arbre dans les commentaires.
Cependant, après la lecture de ce matériel http://www.cprogramming.com/tutorial/stl/stlmap.html j'ai tendance à penser que les std::map n'a rien à voir avec l'arbre ou de hachage.
Donc je suis confus -- les variables et les commentaires dans le code mentir à moi, ou le sujet est plus complexe, je pense que c'est 🙂
Il n'est pas défini par la norme, mais les exigences de complexité sont des sortes de limiter à cet égard.
Ce que cet article vous conduire à croire que
Stroustrup, dans Le Langage de Programmation C++ (4e Édition) déclare "Il est implémenté sous la forme d'un arbre binaire équilibré".
Ce que cet article vous conduire à croire que
std::map
n'a rien à voir avec les arbres?map
est souvent mis en œuvre en utilisant des arbres rouge-noir, tandis que unordered_map
est souvent mis en œuvre en utilisant des tables de hachage. Mais le standard n'a pas de mandat beaucoup donc si vous pouvez venir avec d'autres structures de données qui correspondent à la fois fonctionnelle et de la complexité des exigences de la norme C++ alors tout est bien. 🙂Stroustrup, dans Le Langage de Programmation C++ (4e Édition) déclare "Il est implémenté sous la forme d'un arbre binaire équilibré".
OriginalL'auteur Mark | 2013-08-24
Vous devez vous connecter pour publier un commentaire.
std::map
est un conteneur associatif. La seule condition requise par la norme est que le récipient doit avoir un conteneur associatif interface et le comportement, la mise en œuvre n'est pas défini. Alors que la mise en œuvre correspond à la complexité et les exigences d'interface, est aussi valide la mise en œuvre.D'autre part,
std::map
est généralement mis en œuvre avec un rouge-noir arbre, comme la référence dit.OriginalL'auteur Manu343726
Étape de débogage dans
g++
6.4 stdlibc++ sourceSaviez-vous que sur Ubuntu 16.04 par défaut
g++-6
paquet ou un GCC 6.4 construire à partir de la source vous pouvez entrer dans la bibliothèque C++ sans aucune configuration supplémentaire?En faisant cela, nous pouvons facilement conclure qu'un Rouge-noir arbre utilisé dans cette mise en œuvre.
Ce sens, depuis
std::map
, contrairement àstd::unordered_map
, peuvent être parcourus dans l'ordre des clés, ce qui ne serait pas efficace dans le cas d'un hachage de la carte ont été utilisés.main.cpp
De la compilation et de débogage:
Maintenant, si vous entrez dans
s.emplace(1, -1)
vous atteignez immédiatement/usr/include/c++/6/bits/stl_map.h
:qui, clairement, juste transmet à
_M_t._M_emplace_unique
.Afin de nous ouvrir le fichier source dans
vim
et de trouver la définition de_M_t
:Donc
_M_t
est de type_Rep_type
et_Rep_type
est un_Rb_tree
.OK, maintenant que la preuve est suffisante pour moi. Si vous ne croyez pas que
_Rb_tree
est Noir-rouge arbre, étape un peu plus loin et de lire l'algorithmeunordered_map
utilise une table de hachageMême procédure, mais de remplacer
map
avecunordered_map
sur le code.Ce sens, depuis
std::unordered_map
ne peuvent être parcourus dans l'ordre, donc la norme de la bibliothèque a choisi de hachage de la carte au lieu de Rouge-l'arbre noir, depuis hachage carte a un meilleur amorti, l'heure d'insertion de la complexité.Entrer dans
emplace
conduit à/usr/include/c++/6/bits/unordered_map.h
:Afin de nous ouvrir le fichier source dans
vim
et de recherche pour la définition de_M_h
:Afin de la table de hachage, il est.
std::set
etstd::unordered_set
Analogue à
std::map
vsstd::unordered_map
: Qu'est-ce que les données sous-jacentes de la structure d'un STL jeu en C++?Caractéristiques de Performance
Vous pouvez également déduire la structure de données utilisée par le chronométrage.
Depuis
std::map
est analogue àstd::set
nous voyons clairement:std::map
, logarithmique moment de l'insertionstd::unordered_map
, un modèle plus complexe hashmap modèle:sur le zoom de la parcelle, nous voyons que les temps sont essentiellement constante et en allant vers 250ns, donc beaucoup plus rapide que la
std::map
, sauf pour les très petites tailles de cartePlusieurs bandes sont clairement visibles, et leur inclinaison devient plus petit à chaque fois que le tableau de double.
Je crois que c'est dû à moyenne linéairement croissante liée liste des promenades à l'intérieur de chaque compartiment. Puis, quand le tableau de double, nous avons plus de poubelles, de sorte que des promenades courtes.
Graphique généré avec:
Tas vs BST analyse: Tas vs Binaires un Arbre de Recherche (BST)
OriginalL'auteur Ciro Santilli 新疆改造中心996ICU六四事件
Comme chris ont écrit, la norme ne définit pas la structure interne de la std::map ou std::set. Il définit l'interface et de la complexité des exigences pour des opérations comme l'insertion d'un élément. Ces structures de données peut bien sûr être mis en œuvre que dans les arbres. Par exemple, la mise en œuvre livré avec VisualStudio est basé sur un rouge-noir arbre.
OriginalL'auteur Adam Wulkiewicz
Carte utilise en interne d'auto-équilibrage de la BST . Jetez un oeil sur ce lien.auto-équilibrage des arbres binaires
OriginalL'auteur user1706047
Vue de l'extérieur, une carte est juste un conteneur associatif: il se comporter à l'extérieur comme un "tableau" (prise en charge d'un
a[x]
expression) où x peut être quel que soit le type (pas nécessairement un entier) est "comparable par <" (donc commandé).Mais:
x
peut être n'importe quelle valeur, il ne peut pas être un simple tableau (sinon, il doit prendre en charge quelle que soit la valeur de l'indice: si vous attribuez un[1] et[100] il faut aussi que les 2..99 éléments dans le milieu)Les plus communs de mise en œuvre utilise en interne un auto-équilibrage de l'arbre (chaque nœud est une paire clé/valeur, et sont liés ensemble, de sorte que le côté gauche est plus faible clés, et le côté droit a higer touches, de sorte que seraching est relancée pour une recherche binaire), un multi-skip-list (plus rapide que l'arbre dans la récupération, le ralentissement de l'insert) ou une base de hachage table (où chaque valeur de x est relancée à un indice d'un tableau)
OriginalL'auteur Emilio Garavaglia
Je dirais que si vous pensez à une carte comme une paire, vous ne pouvez pas vous tromper. La carte peut être mis en œuvre comme un arbre ou d'un hachage de la carte, mais la façon dont il est mis en œuvre n'est pas aussi important car vous pouvez être sûr que toute mise en œuvre est TSL est une efficace.
OriginalL'auteur Napalidon