56 votes

Hashtable en C++ ?

J'utilise généralement C++ stdlib map lorsque j'ai besoin de stocker des données associées à un type de valeur spécifique (une valeur clé - par exemple une chaîne de caractères ou un autre objet). L'implémentation de stdlib map est basée sur des arbres qui offrent de meilleures performances (O(log n)) que le tableau standard ou le vecteur stdlib.

Ma question est la suivante : connaissez-vous une implémentation "standard" de hashtable en C++ qui offre des performances encore meilleures (O(1)) ? Quelque chose de similaire à ce qui est disponible dans la classe Hashtable de l'API Java.

80voto

Chris Jester-Young Points 102876

Si vous utilisez C++11, vous avez accès à l'option <unordered_map> y <unordered_set> les en-têtes. Ceux-ci fournissent des classes std::unordered_map y std::unordered_set .

Si vous utilisez C++03 avec TR1, vous avez accès aux classes std::tr1::unordered_map y std::tr1::unordered_set en utilisant les mêmes en-têtes (sauf si vous utilisez GCC, auquel cas les en-têtes sont les suivants <tr1/unordered_map> y <tr1/unordered_set> à la place).

Dans tous les cas, il existe des unordered_multimap y unordered_multiset également.

6 votes

Dans GCC, vous devez utiliser les noms d'en-tête <tr1/unordered_map> et <tr1/unordered_set> à la place. C'est une bizarrerie de GCC :-)

0 votes

Le pack de fonctionnalités VS2008 a été remplacé par le SP1.

0 votes

Je crois que les implémentations tr1::unordered_* du Feature Pack VC9 et du SP1 étaient accompagnées de notes de mise à jour avertissant des performances sous-optimales. Je suppose que cela sera corrigé à terme.

16voto

Mark Ransom Points 132545

Si vous n'avez pas encore unordered_map ou unordered_set, ils font partie du module booster .
Voici la documentation pour les deux .

0 votes

Hourra pour Boost qui fournit portabilité maximale encore une fois :-) Voir stackoverflow.com/questions/131445 pour un autre exemple de ceci.

11voto

Thorsten79 Points 7975

Jetez un coup d'œil à ce blog : Comparaison des bibliothèques de tables de hachage .

3voto

Craig H Points 4224

Il existe un hash_map comme beaucoup l'ont mentionné ici, mais il ne fait pas partie du stl. C'est une extension SGI, donc si vous cherchez quelque chose dans la STL, je pense que vous n'avez pas de chance.

2voto

Adam Rosenfield Points 176408

Visual Studio dispose de la classe stdext::hash_map dans l'en-tête <hash_map> et gcc a la classe __gnu_cxx::hash_map dans le même en-tête.

0 votes

S'ils ont la même interface, il est assez facile de faire une implémentation qui les supporte tous les deux en utilisant des alias d'espace de noms et quelques travaux de pré-processeur.

0 votes

Je sais, je sais, c'est un truc déprécié. Tous les collègues ne sont pas forcément convaincus de passer à VS 2008 ou d'installer Boost. Voici donc une bonne astuce pour les réunir : ` namespace std { #ifdef GNUC using namespace __gnu_cxx ; #elif using namespace stdext ; #endif }`

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X