Je suis relativement nouveau en C++. En Java, il est facile pour moi d'instancier et d'utiliser une table de hachage. J'aimerais savoir comment le faire de manière simple en C++, car j'ai vu de nombreuses implémentations différentes et aucune ne me semblait simple.
La plupart des compilateurs devraient définir std::hash_map
pour vous; à venir C++0x
standard, il fera partie de la bibliothèque standard sous la forme std::unordered_map
. Le page STL est assez standard. Si vous utilisez Visual Studio, Microsoft a une page dessus.
Si vous souhaitez utiliser votre classe comme valeur et non comme clé, vous n'avez rien à faire de spécial. Tous les types primitifs (des choses comme int
, char
, bool
et même char *
) devrait "simplement fonctionner" comme clés dans un hash_map
. Cependant, pour toute autre chose, vous devrez définir vos propres fonctions de hachage et d'égalité, puis écrire des "foncteurs" qui les encapsuleront dans une classe.
En supposant que votre classe s'appelle MyClass
et que vous avez déjà défini:
size_t MyClass::HashValue() const { /* something */ }
bool MyClass::Equals(const MyClass& other) const { /* something */ }
Vous devrez définir deux foncteurs pour encapsuler ces méthodes dans des objets.
struct MyClassHash {
size_t operator()(const MyClass& p) const {
return p.HashValue();
}
};
struct MyClassEqual {
bool operator()(const MyClass& c1, const MyClass& c2) const {
return c1.Equals(c2);
}
};
Et instanciez votre hash_map
/hash_set
comme:
hash_map<MyClass, DataType, MyClassHash, MyClassEqual> my_hash_map;
hash_set<MyClass, MyClassHash, MyClassEqual> my_hash_set;
Tout devrait fonctionner comme prévu après cela.
L'utilisation de hashmaps en C++ est facile! C'est comme utiliser une carte C++ standard. Vous pouvez utiliser l'implémentation de votre compilateur/bibliothèque de unordered_map
ou utilisez celui fourni par boost , ou un autre fournisseur. Voici un petit échantillon. Vous en trouverez plus si vous suivez les liens qui vous ont été fournis.
#include <unordered_map>
#include <string>
#include <iostream>
int main()
{
typedef std::tr1::unordered_map< std::string, int > hashmap;
hashmap numbers;
numbers["one"] = 1;
numbers["two"] = 2;
numbers["three"] = 3;
std::tr1::hash< std::string > hashfunc = numbers.hash_function();
for( hashmap::const_iterator i = numbers.begin(), e = numbers.end() ; i != e ; ++i ) {
std::cout << i->first << " -> " << i->second << " (hash = " << hashfunc( i->first ) << ")" << std::endl;
}
return 0;
}
Jetez un œil à boost.unordered , et à son structure de données .
Essayez les classes boostées non ordonnées .
Consultez Simple Hash Map (Hash Table) Implementation in C++ pour une table de hachage de base avec des paires clé-valeur de type générique et une stratégie de chaînage séparée.