10

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

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

4

6 回答 6

11

只需阅读问题中的第一句话就可以得到答案:

我正在尝试以unordered_map相反的顺序打印

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

于 2012-11-30T11:09:33.783 回答
4

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

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

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

于 2012-11-30T12:26:50.253 回答
0

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

因此,您可以使用无序地图。

正如在上面的帖子中所说,无序映射是完全无序的,所以这样做的一个好方法是有一个向量来保存你的键,然后将所有键值对放在一个无序映射中。然后首先使用向量中的键值使用 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";
}

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

我希望这有帮助!

于 2019-01-10T15:55:17.737 回答
0

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

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

于 2017-10-14T18:29:31.330 回答
0

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

于 2016-09-18T20:11:18.383 回答
-1

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

所以

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

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

Z
Y
X

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

于 2014-07-04T16:06:00.203 回答