创建通用哈希表 - C ++

时间:2009-10-08 10:09:51

标签: .net c++ algorithm hashtable

.NET框架有一个 Dictionary< TKey,TValue> 类,它实现为哈希表,并在恒定时间内提供数据检索(O(1))。我在C ++中寻找类似的实现。我知道 std :: map ,但在这个数据检索中需要对数时间。在C ++中是否有任何良好的哈希表实现,它将在恒定时间内检索数据?

如果我自己编写,我将如何计算密钥的哈希码?和.NET一样,我想过在类型上使用 GetHashCode()方法。

template<typename TKey,typename TVal>
class Dictionary
{
public:
   void Add(TKey key, TVal val){
       int hashCode = key.GetHashCode();
       /* .... */
   }
}

如果我喜欢上述内容并且给定的键类型没有GetHashCode()方法,编译器将抛出错误。但是当key是基本类型(如 int )时,此方法将不起作用。我可能需要通过提供 GetHashCode 来为 int 编写一个包装器。

我想知道实现这个的C ++方式是什么?

有什么想法吗?

6 个答案:

答案 0 :(得分:8)

另外,如果需要严格遵守C ++标准,请查看std::tr1::unordered_map std::hash_map

实际上{{1}}不是C ++标准,但无论如何都被广泛使用。

答案 1 :(得分:7)

如果您没有TR1实现,那么

boost::unordered_map可能是您目前最好和最广泛的便携式解决方案。

答案 2 :(得分:4)

如果您正在寻找即用型实现,那么除了STL / TR1和Boost哈希映射之外,还有google-sparsehash(它包含两个实现 - 一个针对空间进行了优化,另一个针对速度进行了优化)。

如果您想自己编写,那么GetHashCode可以作为单独的仿函数实现,例如

template < typename TKey, typename TValue, typename THash = someDefaultHash<TKey> >
class Dictionary
{
public:
   void Add(TKey key, TVal val){
       int hashCode = THash()(key);
       /* .... */
   }
}

SGI's hash_map就是这样做的。

答案 3 :(得分:2)

也许,std::hash_map

请注意,这不是标准STL库规范的一部分,但通常可用。它位于MS库和SGI库(如链接所示)和STLport中。

答案 4 :(得分:2)

在C ++中,你会传递一个类型的仿函数,它将散列函数作为模板的类型参数。

答案 5 :(得分:2)

假设您在安装了Feature Pack或Service Pack 1的情况下使用VS 2008,您将拥有TR1的实现,其中包括TR1 :: unordered_map。

OTOH,除非你真的在创建巨大的集合,否则std :: map可能会比你预期的更具竞争力。在我的测试中,两者几乎是平局很常见,std :: map可以并且确实更频繁地出现。