Вставка объектов в хеш-таблицу (C ++) - PullRequest
3 голосов
/ 29 октября 2009

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

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

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

Ответы [ 5 ]

3 голосов
/ 29 октября 2009

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

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

hash_map< string, Strain *, hash<string>, eqstr > liveStrainTable;
2 голосов
/ 29 октября 2009

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

1 голос
/ 30 октября 2009

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

Попытка:

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;
0 голосов
/ 29 октября 2009

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

0 голосов
/ 29 октября 2009

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

...