Новый стандарт C ++ 11 содержит неупорядоченные контейнеры. В частности, std::unordered_map<Key, Value>
сохраняет std::pair<Key, Value>
в местоположении на основе std::hash<Key>
(хэш-функция по умолчанию). Аналогично, std::unordered_set<Key>
хранит ключ в местоположении на основе std::hash<Key>
.
Мой вопрос: как можно хранить только Значение пары ключ-значение в месте на основе std::hash<Key>
? Это было бы полезно, если использовать совершенную хеш-функцию , то есть ту, для которой разные ключи отображаются на разные хеш-индексы (поэтому разрешение коллизий никогда не требуется).
unordered_set использует только ключ, а unordered_map использует и ключ, и значение, поэтому неупорядоченные контейнеры STL в новом стандарте C ++ 11, по-видимому, не допускают такой настройки. Что было бы хорошим способом получить такую структуру данных из существующих контейнеров STL?
В более общем смысле, как можно хранить std::pair<T, Value>
в местоположении на основе std::hash<Key>
, где T
- это тип, представляющий подпись Ключа? Например. если Key является большой структурой данных, я хотел бы вычислить 64-битный хеш-ключ и разделить его на две 32-битные части: старшие 32 бита вместе со значением образуют std::pair<uint32_t, Value>
, а нижние 32 бита определяют местоположение где хранится эта пара.
Приложение, где это было бы полезно, например, компьютерные шахматы, где позиция (несколько килобайт в некоторых программах) в качестве типа ключа хэшируется в 64-разрядный ключ, из которого только верхние 32 бита и некоторая информация, связанная с поиском, в качестве типа значения сохраняются как std::pair
( обычно всего 16 байт) в местоположении на основе младших 32 битов хеш-ключа.