2010-10-25 16 views
2

Puisque std::pair<std::string, unsigned int> n'est pas défini pour la table de hachage __gnu_cxx, comment créer une table de hachage __gnu_cxx avec des clés de type std::pair<std::string, unsigned int> et des valeurs de type std::pair<int, CBTNODE>? (CBTNODE est typedef comme typedef int CBTNODE)__gnu_cxx Carte de hachage avec les clés de type std :: pair <std :: string, unsigned int>?

S'il est possible, je voudrais vraiment remplacer std::pair<std::string, unsigned int> avec un typedef-ed INDEX (typedef std::pair<std::string, unsigned int> INDEX)

Toute aide sera très appréciée!

Z.Zen

Répondre

3

Cela semble compiler et imprimer la bonne réponse (1):

#include <hash_map> 
#include <utility> 
#include <string> 
#include <iostream> 

typedef int CBTNODE; 
typedef std::pair<std::string, unsigned int> INDEX; 
typedef std::pair<int, CBTNODE> Element; 

struct pairhash{ 
    size_t operator()(const INDEX &p) const { 
     return 
      __gnu_cxx::hash<const char*>()(p.first.c_str())^
      __gnu_cxx::hash<unsigned int>()(p.second); 
    } 
}; 

int main() { 
    __gnu_cxx::hash_map<INDEX, Element, pairhash> x; 
    INDEX foo("hi", 0); 
    Element bar(1, 2); 
    x[foo] = bar; 
    std::cout << x[foo].first << "\n"; 
} 

Ce qui était un peu fastidieux. Le problème est que __gnu_cxx::hash ne fournit pas une spécialisation pour pair, ou d'ailleurs pour string soit. Je crois qu'il suit l'API SGI ici: http://www.sgi.com/tech/stl/hash.html. Donc pairhash (ou quelque chose comme ça) est nécessaire pour fournir la fonction de hachage manquante.

Je ne vous blâme pas de ne pas avoir repéré cela, puisque l'erreur du compilateur que cela a causé était un peu, um, non évidente. Et longtemps.

Si vous le pouvez, vous êtes probablement mieux d'utiliser boost::unordered_map. Le hash_map de SGI est une ancienne API, jamais adoptée dans la norme, qui doit être remplacée en C++ 0x, etc., etc.