映射和无序映射

Map and unordered_map

本文关键字:映射 无序      更新时间:2023-10-16

我的问题更多的是为了学习而不是调试:

我目前正在为我的一个小游戏优化代码,我想知道:

我在程序中使用映射来分配一些值,那么,无序映射的使用速度比映射快吗?

(顺便说一句,对不起我的英语,这不是我的母语!)

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++文档