Inserimento di oggetti nella tabella hash (C ++)
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.
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.