我想了解有序和无序地图
我了解有序地图会对您的列表进行排序,无序地图不会对其进行排序。从site
开始但是为什么这个代码无论如何都会被排序
std::unordered_map<std::string, int> map;
map.insert(std::make_pair("hello", 1));
map.insert(std::make_pair("world", 2));
map.insert(std::make_pair("call", 3));
map.insert(std::make_pair("ZZ", 4));
for(auto it = map.begin(); it != map.end();it++)
{
std::cout << it->first << std::endl;
}
结果:
world
hello
call
ZZ
我不明白。它应该是你好世界然后然后打电话给ZZ。如果它的无序容器不打算对它进行分类,世界是如何成为第一的。
答案 0 :(得分:3)
std::hash<std::string>
为您的输入键生成哈希值。然后,对这些哈希值应用转换以获得地图中存储桶的有效索引(最基本的一个可以想到的是一个简单的模数)。这些操作需要一段时间,并为您提供物品的位置。为了从转换后的哈希中获取好项目,您需要它在正确的位置。这就是为什么你观察到输入的明显随机排序。
现在可以按计算索引的顺序进行 NO 假设。假设您要在地图中添加更多字符串。某些字符串可能需要重新编码,输入字符串可能会以另一种顺序出现。
这与没有理由保留的插入顺序无关,数据结构的目的是将项目放置在适当的位置,以便可以在摊销的固定时间内进行撤销(这里是将它们放在由变换的哈希给出的指数处。)
答案 1 :(得分:2)
这个问题的最佳答案可能是:“对数据结构进行一些研究。
无序映射应该将数据存储到专门设计为有效但不受存储顺序限制的特殊数据结构中,因此是“无人”的。
请注意,如果您获得了插入顺序,则是对订单的一种限制。
查看此数据结构:哈希表。
答案 2 :(得分:-1)
“无序”的含义是元素以随机顺序返回(基于元素哈希)。