Inserindo objetos em tabela hash (C ++)
Pergunta
Esta é a minha primeira vez fazendo uma tabela hash. Estou tentando cordas associadas (as chaves) com ponteiros para objetos (os dados) da estirpe classe.
// 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;
No arquivo Simulation.cpp, tento inicializar a tabela:
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;
Eu recebo uma mensagem de erro que diz "não é páreo para‘operador []’em‘((Simulação *) este) -> Simulação :: liveStrainTable [MRCA]’." Eu também tentei usando "liveStrainTable.insert (...)" de diferentes maneiras, sem sucesso.
realmente adoraria alguma ajuda sobre isso. Eu estou tendo um momento difícil compreender o apropriado sintaxe para SGI hash_map, eo href="http://www.sgi.com/tech/stl/hash_map.html" rel="nofollow referência SGI pouco esclarece nada para mim. Obrigado.
Solução
liveStrainTable[ MRCA.c_str() ]= firstStrainPtr;
tentativa. Ele espera const char *
como tipo de valor de chave, mas MRCA
tem o tipo string
.
Outra maneira é mudar liveStrainTable
a:
hash_map< string, Strain *, hash<string>, eqstr > liveStrainTable;
Outras dicas
Outros respondido à sua pergunta direta, mas pode eu sugiro usar unordered_map vez -. ele está vindo com a próxima versão do STL e é suportado por todos os principais compiladores
hash_map não faz parte do STL. Não há nenhuma implementação prevista de hash, ou em outras palavras, o hash_map não pode cordas de hash por padrão. Você precisa de sua própria função hash. T
Tente:
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;
O hash_map é definido com const char * como o tipo de chave e você estiver usando um std :: string como a chave ao acessar. Estes são 2 tipos diferentes, o modelo não construir um operador para o segundo tipo, então isso é um erro. Use std :: string para a definição hashmap ou utilização MRCA.c_str ()
Agora, você tem um tipo de mis-match. Você está passando MRCA (a string), onde é esperado um char const *
. Você pode usar c_str()
para obter um char const *
da corda, ou (muito melhor) alterar a definição de sua tabela hash para tomar uma string como seu tipo de chave.