C ++中的哈希表?
每当需要存储与特定类型的值(键值,例如字符串或者其他对象)相关的某些数据时,我通常都会使用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_map
和std :: unordered_set
类。
如果我们使用的是带有TR1的C ++ 03,则可以使用相同的标头访问类std :: tr1 :: unordered_map
和std :: tr1 :: unordered_set
(除非我们使用的是GCC,在这种情况下,标头是" <tr1 / unordered_map>"和" <tr1 / unordered_set>")。
在所有情况下,也都有相应的unordered_multimap
和unordered_multiset
类型。
正如这里许多人提到的那样,有一个hash_map对象,但它不是stl的一部分。这是一个SGI扩展,因此,如果我们正在STL中寻找某些东西,我认为我们很不走运。
Visual Studio在标头<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