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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top