在C + +的哈希表?
每当我需要存储与特定types的值(键值 – 例如string或其他对象)相关联的数据时,我通常使用C ++ stdlib映射。 stdlib映射实现基于树提供比标准数组或stdlib向量更好的性能(O(log n))。
我的问题是,你知道任何提供更好的性能(O(1))的C ++“标准”散列表实现吗? 类似于Java API中的Hashtable类中可用的内容。
如果您使用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
types。
如果你还没有unordered_map或unordered_set,它们是boost的一部分。
这是两个文件 。
有一个hash_map对象在这里已经提到了很多,但它不是stl的一部分。 这是一个SGI扩展,所以如果你在STL中寻找某些东西,我认为你是不幸的。
std :: tr1 :: unordered_map,在<unordered_map>
如果你没有tr1,得到boost,并且使用boost :: unordered_map在<boost/unordered_map.hpp>
Visual Studio在头文件<hash_map>
有__gnu_cxx::hash_map
类,而gcc在同一个头文件中有类__gnu_cxx::hash_map
。
参见SGI的std :: hash_map 。
这也包含在STLPort分配中。
GNU的libstdc ++也支持hash_map。
Dinkumware也支持这一点,这意味着大量的实现将有一个hash_map(我认为甚至Visual C ++与Dinkumware交付)。
如果您的TR1扩展可用于编译器,请使用这些扩展。 如果没有,boost.org有一个非常相似的版本,除了std :: namespace。 在这种情况下,放入使用声明,以便以后可以切换到std ::。
的std ::的hash_map