web-dev-qa-db-fra.com

Hashtable en C ++?

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.

55
Marcos Bento

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.

78
Chris Jester-Young

Si vous n'avez pas déjà unordered_map ou unordered_set, ils font partie de boost .
Voici la documentation pour les deux .

16
Mark Ransom

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.

3
Craig H

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.

2
Adam Rosenfield

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>

2
rlbond

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.

1
MSalters

Voir std :: hash_map de SGI.

Ceci est également inclus dans la distribution STLPort .

1
Adam Tegen

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).

1
Ben Collins