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