Lequel est le plus efficace? Y a-t-il de bons repères?Dans le standard C++ 0x, il y aura unordered_map, comment cela se compare-t-il à boosts unordered_map?
Répondre
La spécification std :: unordered_map de C++ 11 est similaire à boost :: unordered_map qui est basé sur tr1 :: unordered_map. Cela étant dit, il y a quelques petites différences. L'ajout de références rvalue dans C++ 11 entraîne l'ajout des fonctions emplace et emplace_hint qui peuvent être utiles pour les performances.
C++ 11 est maintenant largement implémenté et vous devriez donc pouvoir utiliser std :: unordered_map dès sa sortie de la boîte. C++ 14 ne le modifie pas de manière significative et C++ 17 ajoutera (probablement) les fonctions membres insert_or_assign et try_emplace.
Dans le dernier brouillon standard n3225 de C++ 0x, il existe un modèle de classe section 23.6.1 unordered_map.
Donc, il est déjà là.
C++ 0x unordered_map est proposé basé sur un boost. La bibliothèque Boost elle-même possède également un espace de nommage tr1 :: unordered_map, qui partage l'implémentation de son propre boost: unordered_map. Si vous voulez comparer (bien sûr, vous n'avez pas besoin de comparer boost avec boost), je pense que plusieurs autres compilateurs, y compris Microsoft Visual Studio 2010, et gcc, ont leur propre implémentation unordered_map. Vous pouvez les utiliser en supposant qu'ils sont sous l'espace de noms tr1.
#include <unordered_map>
...
std::tr1::unordered_map<...>
Je ne savais pas encore de référence, mais je pense à ce moment-tôt, une analyse comparative n'a pas de sens parce que le compilateur implémenteur optimiser définitivement leurs propres implémentations lorsque la norme réelle est finalisée et plus de gens va utiliser la bibliothèque.
C'est dans l'espace de nommage 'boost' sauf si vous demandez explicitement le' tr1'. –
Dois-je utiliser le boost un pour la meilleure performance dès maintenant? – returneax
Vous ne devez faire aucun choix en fonction des performances attendues maintenant. Vous devriez utiliser celui qui vous convient le mieux et ensuite chercher des opportunités d'optimisation après avoir profilé votre application et trouvé l'implémentation 'unordered_map' comme un goulot d'étranglement. – SingleNegationElimination
Cela dépend de l'implémentation et de l'ensemble de données en question. Quand je jouais avec unordered_map
pour un blog post j'ai trouvé que VS123 std::unordered_map
perfromed bien pire que boost::unordered_map
pour l'entrée j'ai utilisé (je n'ai pas construit un benchmark approfondi). En théorie, il ne devrait pas y avoir de différence.
Un point mineur non encore mentionné, la fonction std::hash
est uniquement requise pour pouvoir calculer des hachages de types et de chaînes intégrés (et quelques autres types). La fonction boost::hash
peut calculer des hachages d'objets plus complexes tels que pair
et tuple
. Boost a également une fonction hash_combine
pour aider à créer des hachages pour les types définis par l'utilisateur.
Cela signifie que std::unordered_set< pair<int, int> >
ne compilera pas, mais boost::unordered_set< pair<int, int> >
sera.
Vous pouvez utiliser boost::hash
avec std::unordered_*
si nécessaire.
(Référence:. Article 6.18 the Library Extension Technical Report Issues List)
J'ai trouvé que cela s'avérait être une information très importante en termes pratiques. Vous vous retrouvez inévitablement face à vos propres classes pour lesquelles vous devez cuisiner des fonctions de hachage. Donc, même en 2014, je m'en tiens à boost :: unordered_set lorsque je stocke des hashmaps de mes propres classes, en raison de la possibilité de créer facilement des fonctions de hachage. – moodboom
- 1. boost :: unordered_map maintient l'ordre d'insertion?
- 2. C++ unordered_map type défini par l'utilisateur
- 3. Différence entre hash_map et unordered_map?
- 4. boost :: sérialisation de boost :: unordered_map
- 5. Trouver de la valeur dans unordered_map
- 6. "erreur: affectation de l'emplacement en lecture seule" dans unordered_map (C++)
- 7. Je ne comprends pas std :: tr1 :: unordered_map
- 8. Jolie impression boost :: unordered_map sur gdb
- 9. Le choix entre std :: carte et std :: unordered_map
- 10. C++ unordered_map question de la compilation avec g ++
- 11. Question de base lors de l'affectation d'une valeur à unordered_map
- 12. Y at-il une fonction standard pour cela?
- 13. C++ ou C++ 0x - Quel est le meilleur standard?
- 14. Comment le standard C++ 0x définit-il plusieurs déclarations automatiques C++?
- 15. global std :: unordered_map com problèmes de démarrage du serveur
- 16. C++ 0X standard à l'appui des programmes multi-thread
- 17. Indiquez le nombre minimum de godets lors de la construction d'un boost :: unordered_map
- 18. Comment puis-je utiliser un type personnalisé pour les clés d'un boost :: unordered_map?
- 19. Traduction C/C++ à l'assemblage, comportement de mémoire de bas niveau: comment cela se fait-il?
- 20. Définition de la fonction de hachage personnalisée et de la fonction d'égalité pour unordered_map
- 21. Berkeley DB: comment cela se compare-t-il à MongoDB?
- 22. sera cette syntaxe d'initialisation valide dans le prochain standard C++ 0x?
- 23. Comment cela se ferait-il dans ASP.NET MVC?
- 24. Y a-t-il ou y aura-t-il du matériel spécialement conçu pour le code managé?
- 25. Comment le standard C++ devrait-il être utilisé?
- 26. Comment utiliser 'auto' en C++ (C++ 0x)?
- 27. Y aura-t-il une solution pour les événements globaux dans les applications .NET?
- 28. Y compris le fichier d'en-tête défini par la macro
- 29. Pourquoi y a-t-il un opérateur sizeof ... en C++ 0x?
- 30. Comment cela se fait-il "Gérer cette liste" sur amazon?
Je pense que le C++ 0x norme ne spécifie pas une mise en œuvre, il sera assez difficile de référence. Demandez-vous réellement des implémentations spécifiques de stl? – lijie
Et la carte non ordonnée de STL n'est-elle pas l'une des fonctionnalités importées de la norme Boost vers C++? – Kos
Le C++ 0x unordered_map n'est pas basé sur la bibliothèque boost, il est basé sur TR1 unordered_map qui a été défini avant l'implémentation dans la bibliothèque boost. – hmuelner