J'utilise généralement la carte stdlib C++ chaque fois que j'ai besoin de stocker des données associées à un type de valeur spécifique (une valeur clé - par exemple une chaîne ou un autre objet). L'implémentation de la carte stdlib 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 de table de hachage "standard" 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.
Si vous utilisez C++ 11, vous avez accès à <unordered_map>
et <unordered_set>
en-têtes. Ceux-ci fournissent des classes std::unordered_map
et std::unordered_set
.
Si vous utilisez C++ 03 avec TR1, vous avez accès aux classes std::tr1::unordered_map
et std::tr1::unordered_set
, en utilisant les mêmes en-têtes (sauf si vous utilisez GCC, auquel cas les en-têtes sont <tr1/unordered_map>
et <tr1/unordered_set>
au lieu).
Dans tous les cas, il existe unordered_multimap
et unordered_multiset
types aussi.
Si vous n'avez pas déjà unordered_map ou unordered_set, ils font partie de boost .
Voici la documentation pour les deux .
Il y a un objet hash_map comme beaucoup l'ont mentionné ici, mais il ne fait pas partie de la stl. Il s'agit d'une extension SGI, donc si vous cherchez quelque chose dans la STL, je pense que vous n'avez pas de chance.
Visual Studio a 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.
std :: tr1 :: unordered_map, dans <unordered_map>
si vous n'avez pas tr1, obtenez boost et utilisez boost :: unordered_map dans <boost/unordered_map.hpp>
Si vous avez les extensions TR1 disponibles pour votre compilateur, utilisez-les. Sinon, boost.org a une version assez similaire à l'exception de l'espace de noms std ::. Dans ce cas, insérez une déclaration using pour pouvoir passer à std :: later.
Voir std :: hash_map de SGI.
Ceci est également inclus dans la distribution STLPort .
hash_map est également pris en charge dans GNU's libstdc ++ .
Dinkumware aussi prend en charge cela, ce qui signifie que beaucoup d'implémentations auront un hash_map (je pense que même Visual C++ livre avec Dinkumware).