Insertion d'objets dans une table de hachage (C ++)
Question
C'est la première fois que je crée une table de hachage. J'essaie d'associer des chaînes (les clés) à des pointeurs sur des objets (les données) de la classe Strain.
// 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, j'essaie d'initialiser le tableau:
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;
Un message d'erreur indiquant "Pas de correspondance pour" l'opérateur [] & # 8217; dans & # 8216; ((Simulation *) ceci) - > Simulation :: liveStrainTable [MRCA] & # 8217;. "; J'ai également essayé d'utiliser "liveStrainTable.insert (...)". de différentes manières, en vain.
J'aimerais vraiment avoir de l'aide à ce sujet. J'ai de la difficulté à comprendre la syntaxe appropriée pour SGI hash_map et la référence à SGI rien clarifie rien pour moi. Merci.
La solution
Essayez liveStrainTable [MRCA.c_str ()] = firstStrainPtr;
. Il attend const char *
comme type de valeur de clé, mais MRCA
a le type chaîne
.
Une autre méthode consiste à remplacer liveStrainTable
par:
hash_map< string, Strain *, hash<string>, eqstr > liveStrainTable;
Autres conseils
D'autres ont répondu à votre question directe, mais puis-je vous suggérer d'utiliser unordered_map à la place - il arrive avec la prochaine version de la STL et est pris en charge par tous les principaux compilateurs.
hash_map ne fait pas partie de STL. Aucune implémentation n'est fournie pour le hachage. En d'autres termes, hash_map ne peut pas hacher des 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;
Le hash_map est défini avec const char * comme type de clé et vous utilisez un std :: string comme clé lors de l'accès. Ce sont 2 types différents, le modèle n'a pas construit d'opérateur pour le second type, c'est donc une erreur. Utilisez std :: string pour la définition de hashmap ou utilisez MRCA.c_str ()
À l'heure actuelle, vous avez un type qui ne correspond pas. 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 (bien mieux) modifier la définition de votre table de hachage pour prendre une chaîne comme clé. type.