2010-02-01 4 views
43

Je ne sais pas comment utiliser la fonction de hachage en C++, mais je sais que nous pouvons utiliser hash_map. Est-ce que g ++ supporte cela en incluant simplement #include <hash_map>? Qu'est-ce qu'un exemple simple utilisant hash_map?Je voudrais voir un exemple hash_map en C++

+8

@BlueRaja: Oui, en effet, cela conduit à une telle confusion que les gens croient que 'hash_map' fait réellement partie de C++. Je pense que cette question, comme toute autre question liée à la programmation, est ici à la maison ici sur SO, n'est-ce pas? Dire aux gens d'utiliser Google est une perte pour eux et pour notre temps. Ils doivent passer au crible des milliers de réponses inexactes et peu fiables, et les nôtres parce que nous devons ensuite abattre toutes leurs idées fausses et leurs mauvaises pratiques quand ils viennent ici pour poser des questions plus tard. – jalf

+1

@jalf: comme si les réponses sur SO étaient en quelque sorte garanties d'exactitude et de fiabilité. –

+11

Ils sont garantis d'être vus et votés par d'autres programmeurs, ce qui les rend beaucoup plus dignes de confiance que la plupart de ce qu'un débutant pourrait trouver aveuglément sur Google. – jalf

Répondre

50

La norme actuelle C++ n'a pas de cartes de hachage, mais la prochaine norme C++ 0x fait, et ceux-ci sont déjà pris en charge par g ++ sous la forme de « cartes à puces »:

#include <unordered_map> 
#include <iostream> 
#include <string> 
using namespace std; 

int main() { 
    unordered_map <string, int> m; 
    m["foo"] = 42; 
    cout << m["foo"] << endl; 
} 

Pour pour obtenir cette compilation, vous devez dire g ++ que vous utilisez C++ 0x:

g++ -std=c++0x main.cpp 

Ces cartes fonctionnent à peu près comme std :: carte ne, sauf qu'au lieu de fournir une coutume operator<() pour vos propres types , vous devez fournir une fonction de hachage personnalisée - suitab Les fonctions sont fournies pour les types comme les entiers et les chaînes.

+0

+1: vous devriez éditer cette réponse pour mentionner TR1 si ... –

+1

@Kornel Non, je ne devrais pas. TR1 n'a jamais été ratifié - l'espace de noms tr1 est juste une extension fournie par un compilateur. Je ne l'utilise jamais dans mon propre code. –

+0

@Neil, sooo, une personne utilisant GCC 3.4, MSVC et d'autres compilateurs non-C++ 0x ne devrait pas utiliser TR1, mais attendre gratiously jusqu'à ce que les extensions de la bibliothèque C++ 0x soient supportées out of the box? –

9

#include <tr1/unordered_map> vous obtiendrez le prochain standard C++ unique hash container. Utilisation:

std::tr1::unordered_map<std::string,int> my_map; 
my_map["answer"] = 42; 
printf("The answer to life and everything is: %d\n", my_map["answer"]); 
+3

Sortie de style C avec des conteneurs de style C++? Aie! – Bill

+22

Bienvenue dans le monde réel :) –

1

Le nom accepté dans TR1 (et le projet de la norme suivante) est std::unordered_map, donc si vous avez cette disposition, il est probablement celui que vous voulez utiliser.

Autre que cela, son utilisation est beaucoup comme l'utilisation std::map, à condition que lorsque/si vous parcourez les éléments dans un std::map, ils sortent dans l'ordre indiqué par operator<, mais pour un unordered_map, l'ordre est généralement sans signification.

Questions connexes