【问题标题】:Reversing or reverse iterating an unordered_map反转或反向迭代 unordered_map
【发布时间】:2012-11-30 10:56:41
【问题描述】:

我正在尝试以相反的顺序打印 unordered_map 的内容,但是 它没有rbegin 或rend,所以你不能使用reverse_iterator。 unordered_map 的反转应该如何完成?

编辑(来自评论):我希望键按照插入的顺序排列,因此我不能使用 map。键似乎保持在插入顺序中,但我需要将它们颠倒过来。

【问题讨论】:

  • 使用无序地图的全部意义在于它是无序的......也许std::map 会更合适。
  • 我很好奇:你为什么要这么做?
  • @user1866033:但是无序映射中的键是不是的,它们被插入的顺序。它们按 任意 顺序排列。颠倒任意顺序会给您另一个同样任意的顺序,因此毫无意义。
  • 如果您想要一个既能保持顺序又允许按键快速查找的集合,您必须使用Boost.MultiIndex。标准库没有。
  • @user1866033:除了保留顺序的插入之外,您要对其执行哪些操作?目前,std::vector<pair<Key,Value>>push_back 符合您的需求。提供更多信息。

标签: c++ unordered-map


【解决方案1】:

只需阅读问题中的第一句话即可给出答案:

我正在尝试反向打印unordered_map 的内容 顺序

您不能以任何顺序打印,因为它是无序的。在无序结构中谈论秩序是没有意义的。 unordered_map 的内容在内部如何组织并不重要:这是一个实现细节,您无法访问它。在外界看来,unordered_map 完全没有秩序,你不能指望它这样做。

【讨论】:

    【解决方案2】:

    你可以从任意一对双向迭代器中拼凑出你自己的一对反向迭代器:

    std::reverse_iterator rbegin(first);
    std::reverse_iterator rend(last);
    

    正如@Tin 建议的那样,这不起作用。没关系。

    【讨论】:

    • 能否请您扩展您的答案并提供完整示例?我遇到了同样的问题并尝试按照您的建议进行操作,但出现了一些编译器错误。
    • @Tin -- 哎呀,这行不通。 unordered_map 只需要支持前向迭代器;要创建反向迭代器,您必须有一个双向迭代器。
    【解决方案3】:

    将无序地图的内容插入另一个无序地图。请记住以对形式使用 make_pair 插入以保留您的数据。

    【讨论】:

      【解决方案4】:

      当您使用 unordered_map 时,不会维护特定的顺序,因为键值将具有基于实现的哈希码。

      正如您提到的,您需要按照插入的顺序使用它们——很可能您将遍历某种线性列表并将键值对存储在无序映射中。而是使用ordered_map 并根据列表的索引插入。在这种情况下,您的订单将保持为您基于索引作为键插入到地图中。

      【讨论】:

        【解决方案5】:

        首先,当您以键值对的形式给出一些输入并且您需要对其进行一些操作并按照接收输入的顺序打印一些结果时,可以使用这种类型的东西。

        所以你可以使用无序地图。

        正如在上面的帖子中所说,无序映射是完全无序的,所以这样做的一个好方法是有一个向量来保存你的键,然后将所有键值对放在一个无序映射中。然后首先使用向量中的键值使用 find() 查找 map 中的值,然后使用迭代器打印键值对。

        请看下面的例子:

        假设您想以键值对的形式将两个整数作为输入,并且为了对其进行一些操作,您使用了一个无序映射,现在您想按输入的顺序打印值。

        vector<int> v;
        unordered_map<int,int> m;
        unordered_map<int,int>::iterator it;
        

        现在,当您想按输入顺序打印输出时。

        for (int i=0;i<v.size();i++){
                it=m.find(v[i]);
                if(it!=m.end())
                    cout << it->first << " " << it-second << "\n";
        }
        

        这将按输入的顺序打印您的键值对。

        我希望这会有所帮助!

        【讨论】:

          【解决方案6】:

          有同样的问题,unordered_map 以相反的顺序存储数据

          所以

          map[A]=X
          map[B]=Y
          map[C]=Z
          

          如果你迭代 for(map:iterator it=begin...) 你会得到

          Z
          Y
          X
          

          所以它暗示了一个命令,女巫被颠倒了

          【讨论】:

          • unordered_map&lt;&gt;::iterator 迭代条目的顺序完全取决于实现。可能是插入顺序,可能是逆序,也可能是伪随机顺序(unordered_map&lt;&gt;毕竟应该实现为哈希表),也可能是这些的任何交叉,它甚至可能随着大小改变行为。因此,断言它使用相反的顺序是完全错误的,它是实现定义的顺序,故事结束。
          猜你喜欢
          • 2014-09-15
          • 1970-01-01
          • 1970-01-01
          • 2010-10-27
          • 1970-01-01
          • 2023-03-28
          • 1970-01-01
          • 2011-01-03
          相关资源
          最近更新 更多