Я пытаюсь получить настроенную хеш-таблицу, работающую с пользовательскими типами.Ссылаясь на ошибка конструктора unordered_map (шаблонная функция equal_to)
У меня есть:
typedef pair<int, int> tCoord;
struct hashing_func {
unsigned long operator()(const tCoord& key) const {
unsigned long hash = 0;
int h1 = key.first;
int h2 = key.second;
return h1 ^ (h2 << 1);
}
};
struct key_equal_fn {
bool operator()(const tCoord& t1, const tCoord& t2) const {
return t1.first == t2.first && t1.second == t2.second;
}
};
unordered_map<tCoord, int, hashing_func, key_equal_fn> coord2cnt;
unordered_map<tCoord, int, hashing_func, key_equal_fn>::iterator iter;
iter = coord2cnt.find(coord);
Этот фрагмент не компилировался и жаловался на отсутствие вызова функции find ():
error: no matching member function for call to 'find'
Также пытался использовать его как coord2cnt[coord]
, но также получил ошибки при пропущенном операторе []
.
Я компилирую с использованием g ++ 4.2, который немного староват, но прекрасно компилировал следующее (из ссылки выше):
typedef unordered_map<string, string, hashing_func, key_equal_fn> MapType;
MapType::size_type n = 5;
MapType mymap(n, hashing_func(), key_equal_fn());
Также интересно, почему этот тип определенияработа, т. е. указав 5 в первом параметре.Этот способ определения, по-видимому, отсутствует в API unordered_map ??
Кто-нибудь знает, что здесь пошло не так?Спасибо!
ОБНОВЛЕНИЕ: как уже указывалось, строка - это внутренний класс, который имеет встроенную хеш-функцию.Поэтому я перефразировал вопрос, чтобы использовать здесь настраиваемый тип.