ventajas tablas tabla resolucion las funcion desventajas conclusion colisiones codigo busqueda algoritmo c++ hashmap sgi

tablas - Insertar objetos en la tabla hash(C++)



tablas hash mysql (5)

El hash_map se define con const char * como el tipo de clave y está usando std :: string como clave al acceder. Estos son 2 tipos diferentes, la plantilla no creó un operador para el segundo tipo, por lo que este es un error. Use std :: string para la definición de hashmap o use MRCA.c_str ()

Esta es la primera vez que hago una tabla hash. Estoy intentando asociar cadenas (las teclas) con punteros a objetos (los datos) de la clase 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;

En el archivo Simulation.cpp, intento inicializar la tabla:

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;

Aparece un mensaje de error que dice "no coincide con" operador [] ''en'' ((Simulación *) esto) -> Simulación :: liveStrainTable [MRCA] ''. " También intenté usar "liveStrainTable.insert (...)" de diferentes formas, pero no sirvió para nada.

Realmente me gustaría algo de ayuda en esto. Estoy teniendo dificultades para entender la sintaxis adecuada para SGI hash_map, y la referencia SGI apenas aclara nada para mí. Gracias.


En este momento, tienes un tipo de desajuste. Está pasando MRCA (una cadena) donde se espera una char const * . Puede usar c_str() para obtener una char const * de la cadena, o (mucho mejor) cambiar la definición de su tabla de hash para tomar una cadena como su tipo de clave.


Otros respondieron a su pregunta directa, pero, en su lugar, le sugiero usar unordered_map : viene con la próxima versión de STL y es compatible con todos los principales compiladores.


Pruebe liveStrainTable[ MRCA.c_str() ]= firstStrainPtr; . Espera const char * como tipo de clave de valor, pero MRCA tiene type string .

Otra forma es cambiar liveStrainTable a:

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


hash_map no es parte de STL. No hay implementación para hash, o en otras palabras, hash_map no puede hash cadenas por defecto. Necesitas tu propia función hash. T

Tratar:

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;