使用HashTable实现HashMap
Implementing a HashMap using a HashTable implementation
我有一个包含insert, remove, find, exists
等函数的哈希表实现。
使用这个哈希表,我想实现一个hashmap。
所以我想创建一个简单的pair类,它只包含一个键和一个值。它会使operator=
过载,只考虑键的相等性。此外,哈希函数将获得一个pair对象作为输入,并返回哈希值,同样只考虑密钥部分。
因此,我将在哈希映射中有一个hashtable<pair>
,它本质上类似于hashtable<key>
,因为它只考虑关键部分,只携带一个值成员。
但是问题出现了。
例如,我想实现一个exists函数,该函数将检查hashmap中是否存在具有指定键的pair。它会取一个键并检查这个键是否在地图中。这将使用散列表的exists来实现。但是hashtable::exists
现在接受一对类型作为输入。
所以现在我有了这些我不太喜欢的选择
用key创建pair对象,不初始化value部分
将键对象强制转换为对对象(如reinterpret_cast(&key)),因为在这种情况下哈希表的函数将只使用对中的键部分。
第一个创建了一个不必要的副本。第二个键的地址可能不等于pair的对象地址。虽然我相信我可以确定知道密钥的地址考虑到我可以计算
(&pair.key) - (&pair)
使用它,我可以进行适当的强制类型转换,将密钥作为一对传递。
有什么替代方案吗?
如果您查看像google::dense_hash_map
这样的散列映射的现有实现(我将此作为示例,因为我认为它比std::unordered_map
这样的STL代码更容易阅读),您将看到散列映射不仅仅是一个模板化的散列表。
换句话说,它不是这样实现的:
template <class T>
struct hash_table { ... };
template <class Key, class Value>
using hash_map = hash_table<std::pair<Key, Value>>;
…但就像:
template <class Value, class Key>
struct hash_table { ... };
template <class Key, class Value>
struct hash_map
{
using ht = hash_table<std::pair<Key, Value>, Key>;
ht _ht;
};
然后,在hash_table<Value, Key>
中,你可以有insert(const Value&)
,也可以有find(const Key&)
,因为这个类知道所有的类型。
最重要的是你可以很容易地实现hash_set
。整个逻辑将在您的hash_table
类中,hash_map
和hash_set
仅转发调用并为API的客户端做一些修饰性的东西。
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 正在寻找C++不可变的hashset/hashmap
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- DHCP指纹的HashMap实现
- tbb并发hashmap实现字典ADT
- 如何在C++中实现 HashMap 时使用 std::function
- 使用HashTable实现HashMap
- 用hashmap代替邻接矩阵实现maxflow算法
- C++中简单的hashmap实现