【问题标题】:I don't understand std::tr1::unordered_map我不明白 std::tr1::unordered_map
【发布时间】:2010-09-07 08:22:33
【问题描述】:

我需要一个关联容器,它可以让我通过字符串索引某个对象,但它也保持插入顺序,因此我可以通过其名称查找特定对象,或者只是对其进行迭代并检索相同的对象命令我插入它们。

我认为 hybrid of linked list and hash map 应该可以完成这项工作,但在我尝试使用 std::tr1::unordered_map 之前,我认为它以我描述的方式工作,但事实并非如此。那么有人可以解释一下unordered_map 的含义和行为吗?


@wesc:我确定 std::map 是由 STL 实现的,而我确定 std::hash_map 不在 STL 中(我认为旧版本的 Visual Studio 将它放在名为 stdext 的命名空间中)。

@cristopher:所以,如果我做对了,区别在于实现(以及性能),而不在于它在外部的行为方式。

【问题讨论】:

    标签: c++ tr1 unordered-map


    【解决方案1】:

    您已经询问了为什么要创建 Boost::MultiIndex 的典型原因:通过键快速查找的列表插入顺序。 Boost MultiIndex tutorial: list fast lookup

    【讨论】:

      【解决方案2】:

      您需要通过两种方式索引关联容器:

      • 插入顺序
      • 字符串比较

      试试Boost.MultiIndexBoost.Intrusive。我没有用过这种方式,但我认为这是可能的。

      【讨论】:

      • 我知道这是一个非常古老的问题,但是由于一些答案将 Boost Multi Index 作为 OP 需求的解决方案,这些都是正确的,但是任何 Boost multi Index IMO 的建议也应该有链接到 Boost.Intrusive] (boost.org/doc/libs/1_50_0/doc/html/intrusive.html)。使用起来更复杂,但通常更高效、更灵活
      • 是的,我认为 Intrusive 在 2008 年甚至都不存在。
      【解决方案3】:

      Boost documentation of unordered containers

      不同之处在于生成查找的方法。

      在 map/set 容器中,operator< 用于生成有序树。

      在无序容器中,使用operator( key ) => index

      有关其工作原理的说明,请参见散列。

      【讨论】:

        【解决方案4】:

        抱歉,您的最后一条评论读错了。是的,hash_map 不在 STL 中,而 map 是。但是 unordered_map 和 hash_map 和我读到的一样。

        map -> log (n) 插入、检索、迭代是高效的(并且通过key比较排序)

        hash_map/unordered_map -> 常量时间插入和检索,迭代时间不保证高效

        这些都不适合您自己,因为地图根据键内容而不是插入顺序对事物进行排序(除非您的键中包含有关插入顺序的信息)。

        您必须执行您所描述的操作(list + hash_map),或者创建一个具有插入序列号和适当比较函数的键类型。

        【讨论】:

          【解决方案5】:

          认为 unordered_map 和 hash_map 或多或少是一回事。不同之处在于 STL 没有正式的 hash_map(您使用的可能是编译器特定的东西),所以 unordered_map 是对这个遗漏的修复。

          unordered_map 就是……无序的。您不能依赖它在迭代中保留任何顺序。

          【讨论】:

            【解决方案6】:

            您确定 std::hash_map 存在于所有 STL 实现中吗? SGI STL 实现了它,但是 GNU g++ 没有它(它位于 __gnu_cxx 命名空间中)从 4.3.1 开始。据我所知,hash_map 一直是非标准的,现在 tr1 正在修复它。

            【讨论】:

              【解决方案7】:

              @wesc:STL 有std::map...那么与unordered_map 有什么区别?我不认为 STL 会实现两次相同的东西并以不同的方式调用它。

              【讨论】:

              • map 是用平衡二叉树实现的,有其局限性和优势。 unordered_map 是一个哈希表。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-05-29
              • 1970-01-01
              • 2011-08-06
              • 1970-01-01
              相关资源
              最近更新 更多