web-dev-qa-db-fra.com

Implémentation simple de hashmap en C ++

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.

30
Paulo Guedes

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.

26
hazzen

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;
}
16
Kasprzol

Jetez un œil à boost.unordered , et à son structure de données .

7
dalle

Essayez les classes boostées non ordonnées .

3
Mark Ransom

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.

2
aozturk