【问题标题】:Hashtable in C++?C ++中的哈希表?
【发布时间】:2023-03-04 13:15:01
【问题描述】:

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

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

【问题讨论】:

    标签: c++ performance map hashtable complexity-theory


    【解决方案1】:

    如果您使用的是 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 类型。

    【讨论】:

    • 在 GCC 中,您必须使用标题名称 。这是 GCC 的怪癖。 :-)
    • VS2008 Feature Pack 已被 SP1 取代。
    • IIRC VC9 功能包和 SP1 tr1::unordered_* 实现带有发布说明警告次优性能。我认为这最终会得到解决。
    • 谢谢,费鲁乔!我已经合并了你的修复。 (我很抱歉在编辑评论中拼错了你的名字,但我不相信我现在有办法解决这个问题。)
    【解决方案2】:

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

    【讨论】:

    • 如果它们具有相同的接口,那么使用命名空间别名和一些预处理器工作来创建一个支持它们的实现是很容易的。
    • 我知道,我知道,这是不推荐使用的东西。并非每个同事都可能会被说服切换到 VS 2008 或安装 Boost。所以这里有一个关于如何将它们组合在一起的好技巧:` namespace std { #ifdef GNUC using namespace __gnu_cxx; #elif 使用命名空间标准文本; #endif }`
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        如果您还没有 unordered_map 或 unordered_set,它们是 boost 的一部分。
        Here's the documentation for both

        【讨论】:

        【解决方案6】:

        GNU 的 libstdc++ 也支持 hash_map。

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

        【讨论】:

        • 它可能被广泛支持,但它不是提问者所要求的“标准”。只有 TR1 设施可以被视为标准设施。
        • 我的意思是,如果所有编译器供应商都支持它(或 stdlibc++ 供应商,视情况而定),那么它可能是“标准”的足够好的替代品。顺便说一句,TR1 还不是“标准”。它已被下一个标准接受,这足以让供应商实施它(我的观点......)
        • 我认为这仅适用于 libstdc++ 版本 >= 4.0?
        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          请参阅来自 SGI 的 std::hash_map

          这也包含在STLPort 分发中。

          【讨论】:

          • 它可能包含在 STLPort 中,但它仍然不是“标准”,正如所寻求的问题。没有名为 hash_map 的 standard 类;它被称为 unordered_map,它在 TR1 中。
          【解决方案9】:

          【讨论】:

            猜你喜欢
            • 2013-08-20
            • 2012-10-03
            • 2019-03-26
            • 2017-05-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-10-07
            相关资源
            最近更新 更多