56

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

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

4

9 回答 9

80

如果您使用的是 C++11,则可以访问<unordered_map><unordered_set>标头。这些提供类std::unordered_mapstd::unordered_set.

如果您将 C++03 与 TR1 一起使用,则可以使用相同的标头访问类std::tr1::unordered_mapstd::tr1::unordered_set(除非您使用的是 GCC,在这种情况下,标头是<tr1/unordered_map>and <tr1/unordered_set>)。

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

于 2008-09-25T14:15:41.893 回答
16

如果您还没有 unordered_map 或 unordered_set,它们是boost的一部分。
这是两者的文档

于 2008-09-25T14:28:21.363 回答
3

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

于 2008-09-25T14:15:52.110 回答
2

Visual Studiostdext::hash_map在 header 中有这个类<hash_map>,而 gcc__gnu_cxx::hash_map在同一个 header 中有这个类。

于 2008-09-25T14:17:51.653 回答
2

std::tr1::unordered_map,在<unordered_map>

如果您没有 tr1,请获取 boost,并在 in 中使用 boost::unordered_map<boost/unordered_map.hpp>

于 2009-03-25T14:58:45.953 回答
1

参见SGI 的std::hash_map

这也包含在STLPort发行版中。

于 2008-09-25T14:14:29.413 回答
1

GNU 的libstdc++也支持 hash_map 。

Dinkumware 也支持这一点,这意味着很多实现都会有一个 hash_map(我认为即使是 Visual C++ 也提供了 Dinkumware)。

于 2008-09-25T14:20:31.177 回答
1

如果您的编译器有可用的 TR1 扩展,请使用它们。如果没有,boost.org 有一个非常相似的版本,除了 std:: 命名空间。在这种情况下,请放入 using 声明,以便稍后切换到 std::。

于 2008-09-25T14:28:32.173 回答
-1

std::hash_map

于 2008-09-25T14:14:20.337 回答