映射和无序映射
Map and unordered_map
我的问题更多的是为了学习而不是调试:
我目前正在为我的一个小游戏优化代码,我想知道:
我在程序中使用映射来分配一些值,那么,无序映射的使用速度比映射快吗?
(顺便说一句,对不起我的英语,这不是我的母语!)
std::unordered_map
是一个"hash_map",这意味着搜索它是O(1),其中std::map
是一个红黑树,搜索它是0(log2(n))。因此,如果你有1000个元素,区别在于在找到"正确"的键之前先看std::map
中的10个键,而不是看一个。对于100万个元素,在找到"正确"的一个之前,我们先查看std::map
中的20个键——在std::unordered_map
中仍然只有一个。
然而,你需要对"键"进行散列,这意味着要进行某种形式的计算,使其成为一个数字。
它还取决于插入/删除元素的频率,而不是查找元素的频率。
对于较大的数据集,大小和位置也会产生很大影响,在"前几层"中搜索通常很快,因为它在缓存中[如果你在同一地图中搜索了几次],无序映射占用了更多的空间(必须有一些"备用"插槽,因为不太可能所有10000个元素都生成恰好为10000个元素的哈希值,因此通常情况下,哈希映射远未"满")。因为"最近的"散列搜索不太可能与当前的匹配,所以缓存可能也没有多大帮助。
当然,顾名思义,std::unordered_map
是无序的——如果你迭代它,键是按照哈希顺序(模桶计数,所以即使你知道哈希,通常也很难知道它是什么顺序),而不是按照"排序"顺序。这在某些情况下可能很重要。
因此,这是否会给你带来任何明显的性能优势,你必须通过衡量性能来弄清楚。
这里的区别在于map
内部使用红黑树,无序映射是s哈希表。与map
相比,unordermap
非常快,因为将元素放入映射只需要1(O(1))个"操作",其中映射需要在树中找到正确的位置来存储放入映射的值(O(logn))。您还可以阅读地图和非组织地图的C++文档
- 递归无序映射
- 正在将无序映射设置为无序映射的值
- 智能指针作为无序映射键,并通过引用进行比较
- 打印无序映射的第二个元素,即集合
- 由并发无序映射查找线程调用的函数是否安全?
- 如何按值对无序哈希映射进行排序
- 将大数字(10-12 位数字)存储在无序映射中<字符串,整数>
- 使用无序映射在STL中存储键值对
- 为C++中的无序映射获取给定输入键的错误值
- 将大型对象存储在无序映射中是否效率低下
- 在无序映射的结构化绑定中推导类型
- 使用无序映射进行错误索引
- 将一个向量对放在一个无序映射与一个映射中
- 如何在c++中修改无序映射中的每个值
- C++:使用一对(cpp_int,int)整数作为无序映射中的键(其中cpp_int是boost多精度整数)
- 将 [] 索引到无序映射时出现段错误
- 以std::字符串作为关键字,按字典顺序对一个无序映射进行排序
- 无序映射存储桶的节点大小
- 在无序映射<字符串上使用 find(),向量<string>>与 C++ 中的有序映射花费相同的时间
- 以三个无符号字符为关键字的无序映射