使用模板实现c++哈希表类

Implementing a C++ hashtable class using template

本文关键字:c++ 哈希表 实现      更新时间:2023-10-16

我正在尝试在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"…