Доступ к встроенным хэш-функциям типа для tr1 /unordered_map

#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. Большое спасибо за вашу помощь!