2009-10-29 1 views
3

Это мой первый раз, когда вы делаете хеш-таблицу. Я пытаюсь связать строки (ключи) с указателями на объекты (данные) класса Strain.Вставка объектов в хэш-таблицу (C++)

// 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 *) это) -> Simulation :: liveStrainTable [MRCA] «. Я также пытался использовать «liveStrainTable.insert (...)» по-разному, но безрезультатно.

Было бы очень полезно помочь в этом. Мне сложно понять синтаксис, подходящий для SGI hash_map, а SGI reference почти ничего не разъясняет для меня. Благодарю.

ответ

3

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

Другой способ заключается в изменении liveStrainTable на:

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

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

0

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

2

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

+1

Какие преимущества, которые есть? –

+2

Не использовать пространство имен с двумя ведущими символами подчеркивания :) –

1

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

Try:

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

** УДИВИТЕЛЬНЫЙ! ** Спасибо. «LiveStrain [MRCA] = firstStrainPtr;» похоже, сработает - теперь я начну писать все остальные операции. Я не могу дождаться, пока hash_map/unordered_map является частью STL и может обрабатывать строки. – Sarah

+0

«Я не могу дождаться, пока hash_map/unordered_map является частью STL». Фактически, он должен стать частью стандартной библиотеки. Большинство (но не все) STL стали частью std lib в конце 90-х. Есть много других частей std lib, хотя (строки, потоки ...), поэтому «STL» не является синонимом «стандартной библиотеки». – sbi

+0

Кроме того, вполне вероятно, что ваша std lib уже предоставляет 'unordered_map' в пространстве имен' std :: tr1'. В TR1 (технический отчет 1) перечислены довольно много библиотек, которые должны были стать частью следующего стандарта, и призвали поставщиков предоставить их. Он был широко принят. Если ваш std lib не имеет этого, существует реализация среди библиотек boost на http :: www.boost.org. – sbi

Смежные вопросы