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

时间:2013-01-02 20:52:58

标签: c++ templates hash runtime hashtable

我正在尝试在C ++中实现类似于Java版本的哈希表

我希望它具有

的形式
template <class Key, class Value> 
class hashtable {
...
}

很快我注意到我需要以某种方式将Key转换为数字,以便我可以使用简单的哈希函数

int h(int hashkey) { 
    return hashkey%some_prime;
}

但令人头疼的是,Key类型仅在运行时才知道。是否可以在C ++中检查Key在运行时的类型。或者我必须手动创建不同类型的哈希表类?这更容易做但丑陋。有人知道一个优雅的解决方案吗?

3 个答案:

答案 0 :(得分:3)

C ++模板通常是duck typed,这意味着您可以在模板中显式转换为integeral类型,并且所有实现适当转换的类型都可以用作键。这样做的缺点是要求类以这样的方式实现转换运算符,即散列函数将是合适的,这需要很多。

您可以改为提供功能模板

template<typename T> int hash (T t);

除了内置类型的特化之外,任何想要使用自定义类作为键的用户都必须提供自己的专业化。我认为这是一个不错的方法。

答案 1 :(得分:2)

你似乎有一些误解。密钥类型在编译时是已知的 - 这是使用模板的全部要点。其次,实际上没有完全通用的哈希函数可以在任何类型上工作。您需要使用函数重载或模板特化为不同类型实现不同的散列函数。例如,有许多常用的哈希函数用于字符串。

最后,C ++ 11包含一个标准哈希表(std::unordered_map),您可以使用它而不是实现自己的哈希表。

答案 2 :(得分:1)

如果您想尝试实施&#34; generic&#34;一,也许你可以从这样的骨架开始:

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];

}

它通常用一些指针类型实例化,以确定指针应该去哪里,它需要类型实现成员函数&#34; getHashCode&#34; ...