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