Domanda

Questa è la prima volta che realizzo una tabella hash. Sto cercando di associare le stringhe (le chiavi) con i puntatori agli oggetti (i dati) della 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;

Nel file Simulation.cpp, provo a inizializzare la tabella:

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;

Ricevo un messaggio di errore che dice " nessuna corrispondenza per "operatore []" in "((Simulazione *) questa) - > Simulazione :: liveStrainTable [MRCA]". " Ho anche provato a utilizzare " liveStrainTable.insert (...) " in diversi modi, inutilmente.

Mi piacerebbe davvero un aiuto su questo. Sto avendo difficoltà a comprendere la sintassi appropriata per hash_map SGI e la riferimento SGI a malapena chiarisce qualcosa per me. Grazie.

È stato utile?

Soluzione

Prova liveStrainTable [MRCA.c_str ()] = firstStrainPtr; . Si aspetta const char * come tipo di valore chiave, ma MRCA ha il tipo string .

Un altro modo è cambiare liveStrainTable in:

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

Altri suggerimenti

Altri hanno risposto alla tua domanda diretta, ma posso suggerire di usare unordered_map invece - arriva con la prossima versione dell'STL ed è supportato da tutti i principali compilatori.

hash_map non fa parte di STL. Non è prevista alcuna implementazione per l'hash, o in altre parole, hash_map non può utilizzare le stringhe di hash per impostazione predefinita. Hai bisogno della tua funzione hash. T

Prova:

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;

La hash_map è definita con const char * come tipo di chiave e quando si accede si utilizza una stringa std :: string come chiave. Questi sono 2 tipi diversi, il modello non ha creato un operatore per il secondo tipo, quindi si tratta di un errore. Utilizzare std :: string per la definizione hashmap o utilizzare MRCA.c_str ()

In questo momento, hai un tipo di corrispondenza errata. Stai passando MRCA (una stringa) in cui è previsto un char const * . Puoi usare c_str () per ottenere un char const * dalla stringa, oppure (molto meglio) cambiare la definizione della tua tabella hash per prendere una stringa come chiave tipo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top