web-dev-qa-db-fra.com

Quelle est la différence entre le jeu et le hashset dans C ++ STL?

Quand devrais-je choisir l'un sur l'autre? Y a-t-il des indicateurs que vous recommandez d'utiliser les conteneurs STL à droite?

24
kal

hash_set est une extension qui ne fait pas partie de la norme C++. Les recherches doivent être O(1) plutôt que O (journal n) pour set, il sera donc plus rapide dans la plupart des cas.

Une autre différence sera vue lorsque vous iTerez-vous à travers les conteneurs. set fournira le contenu dans l'ordre trié, tandis que hash_set sera essentiellement aléatoire (merci Lou Franco).

Modifier: la mise à jour C++ 11 à la norme C++ introduite unordered_set qui devrait être préféré au lieu de hash_set. La performance sera similaire et garantie par la norme. Le "non-commandé" dans le nom souligne que l'itération il produira des résultats sans ordre particulier.

33
Mark Ransom

stl::set est implémenté comme arbre de recherche binaire. hashset est implémenté comme une table de hachage.

Le problème principal ici est que beaucoup de gens utilisent stl::set Pensant que c'est une table de hachage avec la recherche de O (1), ce qui n'est pas, et n'a pas. Il a vraiment O(log(n)) pour des recherches. Autre cela, lisez à propos des arbres binaires VS Tables de hash pour avoir une meilleure idée des structures de données.

15
Alex

Une autre chose à garder à l'esprit est qu'avec Hash_set, vous devez fournir la fonction Hash, alors qu'un ensemble nécessite une fonction de comparaison uniquement ('<') qui est plus facile à définir (et prédéfini pour les types natifs).

3
ronys

Un hash_set serait implémenté par une table de hachage, qui a principalement O(1) Opérations, alors qu'un ensemble est mis en œuvre par un arbre de quelque sorte (AVL, noir rouge, etc.) qui ont O (log n) opérations, mais sont en ordre triés.

EDIT: J'avais écrit que les arbres sont O (n). C'est complètement faux.

1
Alex Gaynor

Je ne pense pas que quiconque ait répondu à l'autre partie de la question.

La raison d'utiliser hash_set ou un usered_sette est le temps O(1). Je dis généralement parce que chaque si souvent, en fonction de la mise en œuvre, un hachage peut devoir être copié à un plus grand tableau de hachage ou un godet de hachage peut finir par contenir des milliers d'entrées.

La raison d'utiliser un ensemble est si vous avez souvent besoin du plus grand ou de plus petit membre d'un ensemble. Un hachage n'a pas d'ordre, il n'ya donc aucun moyen rapide de trouver le plus petit article. Un arbre a la commande, si le plus grand ou le plus petit est très rapide. O (journal n) pour un arbre simple, O(1) s'il contient les pointeurs vers les extrémités.

1
Zan Lynx