gpt4 book ai didi

c++ - 如何调整无序的 STL 容器以仅存储键值对的值?

转载 作者:行者123 更新时间:2023-11-30 01:27:32 24 4
gpt4 key购买 nike

新的 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只使用key,而unordered_map同时使用key和value,所以新的C++11标准中的无序STL容器似乎不允许这样的定制。从现有的 STL 容器中获取这样的数据结构的好方法是什么?

更一般地说,如何存储 std::pair<T, Value>在基于 std::hash<Key> 的位置, 其中T是表示 key 签名的类型吗?例如。如果 Key 是一个大型数据结构,我想计算一个 64 位哈希键并将其拆分为两个 32 位部分:高 32 位与值一起形成 std::pair<uint32_t, Value> , 低 32 位决定了这对存储的位置。

一个有用的应用程序是,例如电脑象棋,将Key类型的一个位置(某些程序中为几千字节)散列成一个64位的 key ,其中只有高32位和一些搜索相关信息作为Value类型存储为std::pair。 (通常总共只有 16 个字节)位于基于哈希键的低 32 位的位置。

最佳答案

在不连续访问散列值的情况下,没有通用的方法可以对散列执行操作。例如,假设散列内部使用了一棵树。要将新节点添加到哈希中,您需要将其哈希值与树上现有节点的哈希值进行比较。如果您不将它们的值存储在树中,您如何做到这一点?

您所要求的可能并非不可能,但没有一种典型的哈希算法可以做到。而且似乎没有任何意义,你必须存储一些东西才能使集合可遍历,而且很难看出除了散列之外的其他东西如何像散列一样工作,因为这就是您要搜索的内容。

如果散列“太大”,请使用散列的散列。 (当然,那你还得处理哈希冲突。)

关于c++ - 如何调整无序的 STL 容器以仅存储键值对的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8795139/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com