使用模板实现c++哈希表类
Implementing a C++ hashtable class using template
我正在尝试在c++中实现一个类似Java版本的哈希表
我希望它的格式是
template <class Key, class Value>
class hashtable {
...
}
很快我就注意到我需要把Key转换成一个数字,这样我就可以使用简单的哈希函数
int h(int hashkey) {
return hashkey%some_prime;
}
但令人头痛的是,Key类型只有在运行时才知道。是否有可能检查在c++中运行时Key是什么类型?或者我必须手动创建不同类型的哈希表类?这更容易做到,但很难看。有人知道一个优雅的解决方案吗?
c++模板通常是鸭类型的,这意味着您可以在模板中显式地转换为整型,并且所有实现适当转换的类型都可以用作键。这样做的缺点是,要求类实现转换操作符的方式必须使散列函数很合适,这要求很多。
可以提供一个函数模板
template<typename T> int hash (T t);
除了内置类型的专门化之外,任何想使用自定义类作为键的用户都必须提供自己的专门化。我认为这是一个不错的方法。
你似乎有一些误解。键类型在编译时就知道了——这就是使用模板的全部意义。其次,没有一种完全通用的哈希函数可以适用于任何类型。您需要为不同的类型实现不同的哈希函数,使用函数重载或模板专门化。有许多用于字符串的常用散列函数,例如:
最后,c++ 11包含了一个标准哈希表(std::unordered_map),您可以使用它来代替自己实现。
如果你想尝试实现一个"通用"的,也许你可以从一个骨架开始,就像这样:
template <class T, class K>
struct HashEntry { // you would need this to deal with collision
T curr;
K next;
}
template <class V, size_t n>
class HashTable {
void insert(V v)
{
...
size_t idx = v->getHashCode(n);
...
}
private:
HashEntry <V> table_[n];
}
它通常用一些指针类型实例化,为了确定指针应该去哪里,它需要类型实现成员函数"getHashCode"…
相关文章:
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 用C++将哈希表写入文件并从文件中恢复
- C++中的并发哈希表
- 在具有开放寻址的哈希表中插入节点 [优化逻辑]
- 与C++哈希表的基础知识混淆
- 调整大小和复制哈希表数组中的元素
- 带链接的基本哈希表
- C++哈希表中,两个相同的实现,但一个给出错误
- 如果索引不是整数,我们如何在 C++ 中插入哈希表
- 查找项目在哈希表中的位置
- 为什么C++ STL 哈希表 (unordered_map) 不接受向量作为键
- C++哈希表 - 如何解决自定义数据类型作为键的unordered_map冲突?
- 使用哈希表设置实现
- 同时写入和读取哈希表
- 在 C++ 中为特定哈希表创建插入函数
- 我可以比朴素哈希表更快地将随机字符串映射到两个类吗?
- 哈希表:船舶记录
- 使用rehash的C++哈希表问题
- 实现具有浮点键的类似哈希表的数据结构,其中公差内的值被合并在一起