std :: hash_set vs std :: unordered_set, sont-ils la même chose?
Je sais hash_set
est non-standard et unordered_set
est standard. Cependant, je me demande, performance sage, quelle est la différence entre les deux? Pourquoi font-ils exister séparément?
source d'informationauteur unixman83
Vous devez vous connecter pour publier un commentaire.
Les exigences de complexité pour les
unordered_
-conteneurs énoncées par la norme C++ essentiellement ne laisse pas beaucoup de place pour la mise en œuvre, qui doit être une sorte de table de hachage. La norme a été écrit en pleine prise de conscience que ces structures de données avait déjà été déployé par la plupart des fournisseurs comme une extension.Éditeurs de compilateurs généralement appel de ces conteneurs "hash map" ou "hash set", qui est ce que vous êtes probablement en se référant à (il n'est pas littérale
std::hash_set
dans la norme, mais je pense qu'il y en a un dans GCC dans un autre espace de noms, et de même pour d'autres compilateurs).Lorsque la nouvelle norme a été écrit, les auteurs ont voulu éviter la confusion possible avec l'existant extension, dans les bibliothèques, alors ils ont opté pour un nom qui reflète la typique du C++ état d'esprit: dire ce qu'il est, pas la façon dont il est mis en œuvre. Le non-ordonnée conteneurs sont, ainsi, non ordonnée. Cela signifie que vous avez moins d'eux par rapport à la commande, les conteneurs, mais cette diminution de l'utilitaire vous donne un accès plus efficace.
Mise en œuvre-sage, hash_set, Boost-non ordonnée, TR1-non ordonnée et C++11-non ordonnée sera très semblables, sinon identiques.
Concernant la question "sont-ils la même chose" à partir de la ligne de l'objet: basé sur mon expérience de la mise à niveau du code de __gnu_cxx::hash_set à std::unordered_set, ils sont presque, mais pas exactement la même chose.
La différence que j'ai couru en est qu'à itérer __gnu_cxx::hash_set retourné les éléments dans ce qui semblait être l'original de l'ordre d'insertion, alors que std::unordered_set ne le serait pas. Donc comme le nom l'indique, on ne peut pas compter sur un itérateur pour nous retourner les articles dans un ordre particulier lors de l'itération si tout le std::unordered_set.
Visual Studio 2010, par exemple, a la fois
hash_xxx
etunordered_xxx
et si vous regardez dans les en-têtes, au moins leur mise en œuvre est la même pour tous ceux (même de base/"politique"-classes).Pour d'autres compilateurs, je ne sais pas, mais en raison de la façon de hachage contenant généralement être mis en œuvre, je suppose qu'il n'y aura pas beaucoup de différences, si ce n'est aucune.
Ils sont à peu près les mêmes choses. Le standard C++(C ++ 0x) nom unordered_set. hash_set a été un nom plus tôt à partir de stimuler et d'autres.