#c #stl #unordered-map
#c #stl #неупорядоченная карта
Вопрос:
Я возлюсь с unordered_map
шаблоном класса и хотел бы написать пользовательский хэшер для своего класса. В документации к нему упоминается, что функции хеширования по умолчанию предоставляются для встроенных типов. Итак, если вы объявите:
std::tr1::unordered_map<std::string, int> foo;
Вы автоматически получаете определенный для вас хэшер.
Здесь есть хороший пример того, как предоставить функтор, если вам нужна пользовательская хэш-функция.
Однако, что, если у меня есть сложный класс, в котором есть std::string
член, который я хотел бы использовать в качестве ключа для вставки / удаления в unordered_map
? Я не хочу переписывать свой собственный хэшер. Я хочу использовать то, что уже было написано для std::string
типа.
Ответ №1:
Хэш-функтор по умолчанию предоставляется с помощью, std::hash<T>
который возвращает size_t
.
Таким образом, вы можете объединить хэш из нескольких членов класса, например, путем вычисления (std::hash<T>()(a) prime * (std::hash<T>()(b) prime * std::hash<T>()(c)))
.
Комментарии:
1. Хорошо, значит, я должен быть в состоянии выполнить: std::hash<std::string>(mystring)?
2. Вам необходимо создать экземпляр функтора.
std::hash<std::string>()(mystring)
должно сработать.3. Хорошо, я попытался это сделать, и я получил сообщение о том, что ‘hash’ не является членом ‘std’. Для этого используется g 4.2.1 в macOS. При желании я могу предоставить исходный код примера.
4. Используйте
std::tr1::hash
или более новый компилятор, который реализует C 0x вstd
пространстве имен.5. Моя ошибка. Я забыл добавить дополнительные скобки, как вы показали выше. Это доступно в std::tr1::hash в gcc-4.2.1. Большое спасибо за вашу помощь!