反转或反向迭代unordered_map

时间:2012-11-30 10:56:41

标签: c++ unordered-map

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

编辑(来自评论):我希望密钥按插入顺序排列,因此我无法使用地图。键似乎保持在插入顺序中,但我需要它们反转。

6 个答案:

答案 0 :(得分:8)

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

  

我正在尝试反向打印unordered_map的内容   为了

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

答案 1 :(得分:4)

你可以从任何一对双向迭代器中弄乱你自己的一对反向迭代器:

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

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

答案 2 :(得分:0)

将无序地图的内容插入另一张未退回的地图。请记住以对形式使用make_pair进行插入以保留数据。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

正如以上文章所述,无序映射是完全无序的,因此,执行此操作的一种好方法是让向量具有键,然后在无序映射中包含所有键值对。然后,首先使用vector中的键值,然后使用find()在地图中查找值,然后使用迭代器打印键值对。

请参见以下示例:

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

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";
}

这将按照输入顺序打印键/值对。

我希望这会有所帮助!

答案 5 :(得分:-1)

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

所以

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

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

Z
Y
X

所以它意味着一个订单,女巫被颠倒了