Вопрос

Я впервые делаю хеш-таблицу.Я пытаюсь связать строки (ключи) с указателями на объекты (данные) класса 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;

В файле Simulation.cpp я пытаюсь инициализировать таблицу:

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;

Я получаю сообщение об ошибке, в котором говорится «Не совпадать с« Оператором [] »в» ((Simulation*) this)-> Simulation :: Livestableable [mrca] ».». Я также пытался использовать "livestable.insert (...)" по -разному, но безрезультатно.

Очень хотелось бы получить помощь в этом вопросе.Мне трудно понять синтаксис, подходящий для SGI hash_map, и ссылка на SGI мне почти ничего не проясняет.Спасибо.

Это было полезно?

Решение

Попробуйте liveStrainTable [MRCA.c_str ()] = firstStrainPtr; . Он ожидает const char * в качестве типа значения ключа, но MRCA имеет тип string .

Другой способ - изменить liveStrainTable на:

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

Другие советы

Другие ответили на ваш прямой вопрос, но могу ли я предложить использовать Вместо этого unordered_map - он поставляется со следующей версией STL и поддерживается всеми основными компиляторами.

hash_map не является частью STL.Для хэша не предусмотрена реализация, или, другими словами, hash_map по умолчанию не может хешировать строки.Вам нужна собственная хэш-функция.Т

Пытаться:

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;

hash_map определено с const char * в качестве типа ключа, и вы используете std :: string в качестве ключа при доступе. Это 2 разных типа, шаблон не построил оператор для второго типа, так что это ошибка. Используйте std :: string для определения hashmap или используйте MRCA.c_str ()

Прямо сейчас у вас несоответствие типов. Вы передаете MRCA (строку), где ожидается char const * . Вы можете использовать c_str () , чтобы получить char const * из строки, или (намного лучше) изменить определение вашей хеш-таблицы, чтобы взять строку в качестве ее ключа тип.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top