.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 ++方式是什么?
有什么想法吗?
答案 0 :(得分:8)
另外,如果需要严格遵守C ++标准,请查看std::tr1::unordered_map
std::hash_map
。
实际上{{1}}不是C ++标准,但无论如何都被广泛使用。
答案 1 :(得分:7)
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可以并且确实更频繁地出现。