有序和无序映射
Ordered and unordered map
我正在尝试理解有序和无序映射
我知道有序的地图会对你的列表进行排序,而无序的地图不会对它进行排序
但为什么这个代码无论如何都会被排序
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"。如果不假设无序容器对世界进行排序,那么世界是如何排在第一位的呢?
std::hash<std::string>
为您的输入键生成散列。然后,对这些散列进行转换,以获得映射中bucket的有效索引(人们能想到的最基本的是一个简单的模)。这些操作需要持续的时间,并为您提供物品的位置。为了从转换后的哈希中获得好的项目,您需要它位于正确的位置。这就是为什么你观察到你的输入有一个明显的随机顺序。
现在有NO假设,您可以根据计算的指数的顺序进行。假设您要在映射中添加更多的字符串。也许某些字符串需要重新散列,并且您的输入字符串可能会以另一种顺序出现。
这与没有理由保留的插入顺序无关,数据结构的目的是将项目放置在适当的位置,以便可以在摊销的恒定时间内进行检索(这里是将它们放置在转换哈希给出的索引处)。
也许,这个问题的最佳答案是说:"研究一下数据结构。
无序映射应该将数据存储到一个特殊的数据结构中,该数据结构专门设计为高效的,但对存储顺序没有任何限制,因此是"无序的"。
请注意,如果您获得插入顺序,则是对该顺序的一种限制。
看看这个数据结构:哈希表。
他们所说的"无序"是指元素以随机顺序(基于元素哈希)返回。
相关文章:
- 递归无序映射
- 正在将无序映射设置为无序映射的值
- 智能指针作为无序映射键,并通过引用进行比较
- 打印无序映射的第二个元素,即集合
- 由并发无序映射查找线程调用的函数是否安全?
- 如何按值对无序哈希映射进行排序
- 将大数字(10-12 位数字)存储在无序映射中<字符串,整数>
- 使用无序映射在STL中存储键值对
- 为C++中的无序映射获取给定输入键的错误值
- 将大型对象存储在无序映射中是否效率低下
- 在无序映射的结构化绑定中推导类型
- 使用无序映射进行错误索引
- 将一个向量对放在一个无序映射与一个映射中
- 如何在c++中修改无序映射中的每个值
- C++:使用一对(cpp_int,int)整数作为无序映射中的键(其中cpp_int是boost多精度整数)
- 将 [] 索引到无序映射时出现段错误
- 以std::字符串作为关键字,按字典顺序对一个无序映射进行排序
- 无序映射存储桶的节点大小
- 在无序映射<字符串上使用 find(),向量<string>>与 C++ 中的有序映射花费相同的时间
- 以三个无符号字符为关键字的无序映射