【发布时间】:2025-12-23 11:05:12
【问题描述】:
新的 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 容器中获取这种数据结构的好方法是什么?
更一般地说,如何将std::pair<T, Value> 存储在基于std::hash<Key> 的位置中,其中T 是表示密钥签名的类型?例如。如果 Key 是一个大数据结构,我想计算一个 64 位哈希键并将其分成两个 32 位部分:高 32 位与 Value 一起形成std::pair<uint32_t, Value>,低 32 位确定位置这对存储在哪里。
这很有用的应用程序是,例如计算机国际象棋,其中一个位置(在某些程序中为几千字节)作为 Key 类型被散列成一个 64 位的密钥,其中只有高 32 位和一些作为 Value 类型的搜索相关信息存储为std::pair(通常总共只有 16 个字节)在基于散列密钥的低 32 位的位置中。
【问题讨论】:
-
如果
Key是您所假设的一个大型数据结构,那么它现在是如何存储的?实际存储它没有价值吗?构建hash<Key>的密集程度如何?鉴于Key作为价值的一部分,我看不到你不能用set得到什么,或者比map有什么好处。您保存 16 位 64 位值的示例不足以让我相信它值得付出努力。 -
所以你想要一些使用 hash
来确定放置 Value 的位置,而不在任何地方存储 hash 的东西? -
存储密钥是实现要求。没有它就做一个哈希表是不合理的,因为你需要检查多个哈希到一个桶。
-
@rhalbersma :您描述的是“可扩展”,而不是“通用”。后者仅仅意味着大多数时候对大多数人来说已经足够好了。您正在寻找的内容远远超出此范围。
-
@rhalbersma : "用于从值类型中提取键的特征类" 如果这是您所追求的,请查看 Boost.MultiIndex ,因为这正是它的工作原理。 :-]
标签: c++ stl c++11 unordered-map unordered-set