2009-10-29 10 views
3

C'est la première fois que je crée une table de hachage. J'essaie d'associer des chaînes (les clés) avec des pointeurs sur des objets (les données) de la classe Strain.Insertion d'objets dans la table de hachage (C++)

// Simulation.h 
#include <ext/hash_map> 
using namespace __gnu_cxx; 

struct eqstr 
{ 
bool operator()(const char * s1, const char * s2) const 
    { 
    return strcmp(s1, s2) == 0; 
    } 
}; 

... 
hash_map< const char *, Strain *, hash< const char * >, struct eqstr > liveStrainTable; 

Dans le fichier Simulation.cpp, je tente d'initialiser la table:

string MRCA; 
for (int b = 0; b < SEQ_LENGTH; b++) { 
    int randBase = rgen.uniform(0,NUM_BASES); 
    MRCA.push_back(BASES[ randBase ]); 
} 
Strain * firstStrainPtr; 
firstStrainPtr = new Strain(idCtr, MRCA, NUM_STEPS); 
liveStrainTable[ MRCA ]= firstStrainPtr; 

Je reçois un message d'erreur qui se lit « aucune correspondance pour 'opérateur []' dans « ((Simulation *) this) -> Simulation :: liveStrainTable [MRCA] '. " J'ai également essayé d'utiliser "liveStrainTable.insert (...)" de différentes manières, en vain.

J'aimerais beaucoup de l'aide à ce sujet. J'ai du mal à comprendre la syntaxe appropriée pour SGI hash_map, et le SGI reference clarifie à peine quelque chose pour moi. Merci.

Répondre

3

Essayez liveStrainTable[ MRCA.c_str() ]= firstStrainPtr;. Il attend const char * comme type de valeur de clé, mais MRCA a le type string.

Une autre façon est de changer liveStrainTable à:

hash_map< string, Strain *, hash<string>, eqstr > liveStrainTable; 
0

Le hash_map est défini par const char * comme le type de clé et que vous utilisez un std :: string comme la clé lors de l'accès. Ce sont 2 types différents, le modèle n'a pas construit un opérateur pour le second type, donc c'est une erreur. Utilisez std :: string pour la définition de hashmap ou utilisez MRCA.c_str()

0

À l'heure actuelle, vous avez une erreur de type. Vous passez MRCA (une chaîne) où un char const * est attendu. Vous pouvez utiliser c_str() pour obtenir un char const * à partir de la chaîne, ou (de loin) changer la définition de votre table de hachage pour prendre une chaîne comme type de clé.

2

D'autres ont répondu à votre question directe, mais je peux suggérer d'utiliser unordered_map à la place - il vient avec la prochaine version de la STL et est supporté par tous les principaux compilateurs.

+1

Quel avantage que cela a? –

+2

Ne pas utiliser l'espace de noms avec deux traits de soulignement principaux :) –

1

hash_map ne fait pas partie de STL. Aucune implémentation n'est fournie pour le hachage, ou en d'autres termes, hash_map ne peut pas hacher les chaînes par défaut. Vous avez besoin de votre propre fonction de hachage. T

Essayez:

typedef struct { 
    size_t operator()(const string& str) const { 
    return __gnu_cxx::__stl_hash_string(str.c_str()); 
    } 
} strhash; 

hash_map< string, Strain *, strhash, eqstr > liveStrainTable; 
+0

** AWESOME! ** Merci. Le "liveStrain [MRCA] = firstStrainPtr;" semble fonctionner - je vais commencer à écrire toutes les autres opérations maintenant. Je ne peux pas attendre que hash_map/unordered_map fasse partie de STL et puisse gérer les chaînes. – Sarah

+0

"Je ne peux pas attendre que hash_map/unordered_map fasse partie de STL" En fait, il doit faire partie de la bibliothèque standard. La plupart (mais pas la totalité) de la STL est devenue une partie de la bibliothèque std à la fin des années 90. Cependant, il y a beaucoup d'autres parties de la lib std (chaînes, flux ...), donc "STL" n'est pas un synonyme de "bibliothèque standard". – sbi

+0

En outre, il est en fait assez probable que votre lib std fournisse déjà 'unordered_map' dans l'espace de noms' std :: tr1'. TR1 (Technical Report 1) répertorie un certain nombre de bibliothèques qui étaient censées faire partie de la prochaine norme et a encouragé les fournisseurs à les fournir. Il a été largement adopté. Si votre bibliothèque std ne l'a pas, il existe une implémentation parmi les bibliothèques de boost sur http: www.boost.org. – sbi