我正在尝试在C ++中实现类似于Java版本的哈希表
我希望它具有
的形式template <class Key, class Value>
class hashtable {
...
}
很快我注意到我需要以某种方式将Key转换为数字,以便我可以使用简单的哈希函数
int h(int hashkey) {
return hashkey%some_prime;
}
但令人头疼的是,Key类型仅在运行时才知道。是否可以在C ++中检查Key在运行时的类型。或者我必须手动创建不同类型的哈希表类?这更容易做但丑陋。有人知道一个优雅的解决方案吗?
答案 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; ...