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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top