Вставка объектов в хеш-таблицу (C++)

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

Решение

Пытаться 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 не может хэшировать строки по умолчанию. Вам нужна собственная хеш-функция. 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;

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

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

Другие вопросы по тегам