【问题标题】:C++ <map> vs <unordered_map> vs <tr1/unordered_map> vs <ext/unordered_map>C++ <map> vs <unordered_map> vs <tr1/unordered_map> vs <ext/unordered_map>
【发布时间】:2011-05-29 12:31:33
【问题描述】:

我目前正在寻找一个更好的替代 std::map 的方法,并且遇到了帖子标题中提到的类。有人可以澄清它们之间的区别,不是在性能/API 方面,而是在它们与当前和未来标准相关的位置方面。

【问题讨论】:

    标签: c++ c++11 tr1 unordered-map


    【解决方案1】:
    • std::map : 当前 C++ 标准关联容器(键/值),作为树后工作;
    • std::unordered_map :下一个标准(C++0x -- 或在技术报告 1 中)哈希映射容器,用作...哈希映射。
    • std::tr1::unordered_map :与前一个相同,但位于 tr1 命名空间中,通常出现在希望提供 TR1 扩展但位于 std 之外的另一个命名空间的编译器中。
    • ext::unordered_map :仍然是相同的想法,但特定于编译器的实现,因此不能保证在接口和实现上与 std::unordered_map 完全相同。

    如果可以,请使用 std::unordered_map,因为它是哈希映射实现的最终名称(如果您需要哈希映射)。如果您的编译器提供了其他名称,但它们位于单独的命名空间中(因为 C++0x 尚未正式可用)。

    顺便说一下boost::unordered_map,不过思路和界面都差不多。

    【讨论】:

    • 如此接近。 ext::unordered_map 可以是任何东西,并且与标准完全无关。它可能是也可能不是相同的接口,这对于任何有兴趣让客户端代码为新标准做好准备而不是适应特定实现的人来说都是非常重要的。此外,tr1 命名空间是 unordered_map 存在于 TR1 中的位置,而不是 std::namespace。 tr1 中的某些内容与最终将在 std 中发布的内容不同。由于 std 尚不存在,很难说 std::unordered_map 实际上与该 std 有什么关系,如果有任何差异。
    • 这将在一个库中使用,因此将使用哪些宏来防止使用 std::unordered_map 被错误地包含在应该使用 std::map 的地方?
    • 在 std:: 命名空间中发布新内容的编译器所做的是尝试预测这些新内容会是什么样子。在某些方面他们是错的,在另一些方面他们是对的。 unordered_map 被更改的可能性不是很大,但其他事情已经发生了,例如,MSVC 发布了。
    • @user - 不可能混合 map 和 unordered_map。它们完全不同,在不同的标题中等等......你必须非常努力地混淆它们。
    • Noah Roberts> 我没有说清楚,但这就是我对 ext::unordered_map 的意思。我会修改说明。
    【解决方案2】:

    &lt;tr1/*&gt; 中的标题是在TR1 'draft' 中指定的内容。我相信其中很多可能会发展到 C++0x(尽管这不能保证,并且也存在不兼容更改的空间)。据我了解,&lt;ext/*&gt; 是非标准(即特定于供应商)的扩展。 Boost 还提供了一个unordered_map,如果您尝试针对不提供您提到的任何标头的编译器,这可能会很方便。

    【讨论】:

      【解决方案3】:

      如果您谈论的是 ext/unordered_map,那么这是旧的 SGI/HP STL 组件。它与其他 unordered_maps 非常相似。我会使用 std::unordered_map 作为标准组件——这就是未来。

      我了解旧的 SGI/HP 哈希容器由于某种原因几乎没有被纳入 C++98 标准。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-08
        • 1970-01-01
        • 2013-01-30
        • 2016-04-09
        • 2011-11-10
        • 1970-01-01
        相关资源
        最近更新 更多