boost :: unordered_map - нужно указать собственную хеш-функцию для хеширования std :: set <int> - PullRequest
4 голосов
/ 18 сентября 2011

Я бы хотел использовать boost::unordered_map<key,value>, где key - это std::set<int>. Поскольку набор целых чисел не является встроенным типом, я предположил, что должен был предоставить свою собственную хэш-функцию (или, скорее, я думал об использовании хеш-параметра boost ).

Однако теперь я попытался инициализировать хеш-карту, как эта, не предоставляя хеш-функцию или предикат равенства - и gcc не жаловался. Что здесь происходит? Является ли boost достаточно умным, чтобы хэшировать контейнеры STL самостоятельно? Это будет медленнее, чем если бы я использовал пользовательскую хеш-функцию? Как насчет использования boost::hash_range?

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 18 сентября 2011

По умолчанию выбрана функция boost::hash< Key >.Согласно документации

Поскольку он совместим с TR1, он будет работать с:

integers
floats
pointers
strings

Он также реализует расширение, предложенное Петром Димовым в выпуске 6.18 расширения библиотеки.В списке проблем технического отчета (стр. 63) добавлена ​​поддержка:

arrays
std::pair
the standard containers.
extending boost::hash for custom types.

http://www.boost.org/doc/html/hash.html

Так что да, boost достаточно умен, чтобы хэшировать контейнеры STL.Если вы не знаете что-то конкретное из вашего конкретного варианта использования set, я сомневаюсь, что есть какой-то смысл в предоставлении вашей собственной хэш-функции.

3 голосов
/ 18 сентября 2011

Согласно документации Boost :

хеш-функцией по умолчанию является Boost.Hash

И, согласно документациидля Boost.Hash для стандартных контейнеров предусмотрены хэш-функции по умолчанию.Следовательно, уже есть хеш-функция, написанная для std::set.Хэш-контейнеры Boost недостаточно умны, чтобы знать, как автоматически хэшировать наборы, но они достаточно умны, чтобы использовать уже предоставленную реализацию.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...