新的 C++11 标准具有无序容器。特别是,std::unordered_map<Key, Value>
存储std::pair<Key, Value>
在一个基于std::hash<Key>
(默认散列函数)的位置。同样,std::unordered_set<Key>
将 Key 存储在基于 的位置std::hash<Key>
。
我的问题是:如何仅将键值对的值存储在基于的位置std::hash<Key>
?如果使用完美的散列函数,即不同的键映射到不同的散列索引(因此永远不需要冲突解决),这将很有用。
unordered_set 只使用键,而 unordered_map 同时使用键和值,因此新 C++11 标准中的无序 STL 容器似乎不允许这种自定义。从现有的 STL 容器中获取这种数据结构的好方法是什么?
更一般地说,如何将 a 存储std::pair<T, Value>
在基于 的位置中std::hash<Key>
,T
表示密钥签名的类型在哪里?例如,如果 Key 是一个大型数据结构,我想计算一个 64 位哈希键并将其分成两个 32 位部分:高 32 位与值一起形成 a std::pair<uint32_t, Value>
,低 32 位确定它的位置存储对。
这将是有用的应用程序,例如计算机国际象棋,其中作为密钥类型的位置(在某些程序中为数 KB)被散列为 64 位密钥,其中只有高 32 位和一些搜索相关信息作为值type 以 a std::pair
(通常总共只有 16 个字节)的形式存储在基于哈希键的低 32 位的位置中。