C ++中的哈希表?

时间:2020-03-06 14:43:22  来源:igfitidea点击:

每当需要存储与特定类型的值(键值,例如字符串或者其他对象)相关的某些数据时,我通常都会使用C ++ stdlib映射。 stdlib映射实现基于树,该树比标准数组或者stdlib向量提供更好的性能(O(log n))。

我的问题是,我们是否知道任何提供更好性能的C ++"标准"哈希表实现(O(1))?与Java API中的Hashtable类中可用的东西类似。

解决方案

std :: hash_map

请参阅SGI的std :: hash_map。

这也包括在STLPort发行版中。

如果我们使用的是C ++ 11,则可以访问<unordered_map><unordered_set>标头。它们提供了std :: unordered_mapstd :: unordered_set类。

如果我们使用的是带有TR1的C ++ 03,则可以使用相同的标头访问类std :: tr1 :: unordered_mapstd :: tr1 :: unordered_set(除非我们使用的是GCC,在这种情况下,标头是" <tr1 / unordered_map>"和" <tr1 / unordered_set>")。

在所有情况下,也都有相应的unordered_multimapunordered_multiset类型。

正如这里许多人提到的那样,有一个hash_map对象,但它不是stl的一部分。这是一个SGI扩展,因此,如果我们正在STL中寻找某些东西,我认为我们很不走运。

Visual Studio在标头&lt;hash_map>中具有类stdext :: hash_map,而gcc在同一标头中具有类__gnu_cxx :: hash_map

GNU的libstdc ++也支持hash_map。

Dinkumware也支持此功能,这意味着许多实现都将具有hash_map(我认为即使Visual C ++也会随Dinkumware一起提供)。

如果我们还没有unordered_map或者unordered_set,则它们是增强功能的一部分。
这是两者的文档。

如果编译器有可用的TR1扩展名,请使用这些扩展名。如果不是,boost.org的版本非常相似,除了std ::名称空间。在这种情况下,请输入using-声明,以便稍后可以切换到std ::。

std :: tr1 ::: unordered_map,位于" <unordered_map>"中

如果我们没有tr1,请加大力度并使用
<boost / unordered_map.hpp>中的boost :: unordered_map