我的问题更多是出于学习目的而非调试目的:
我正在为我的小游戏优化代码,我想知道:
我正在使用地图在我的程序中调度一些值,因此使用的unordered_map比地图更快吗?
(对不起我的英文,这不是我的母语!)
答案 0 :(得分:2)
std::unordered_map
是" hash_map",这意味着搜索它是O(1),其中std::map
是红黑树,搜索是O( LOG2(N))。所以,如果你有1000个元素,那么差异就是在找到"右边"之前std::map
中的10个键。一,而不是看一个。有了100万个元素,我们会在std::map
中看到20个键,然后才能进入"右键"一个 - 仍然只有一个std::unordered_map
。
但是,你需要对"键"进行哈希处理,这意味着要进行某种形式的计算以使其成为一个数字。
与您查看元素的频率相比,它还取决于插入/删除元素的频率。
对于较大的数据集,大小和位置也会产生很大的影响,并且可以搜索"前几层"通常很快,因为它在缓存中[如果你在同一个地图上多次搜索],无序地图占用更多空间(必须有一些"备用"插槽,因为它& #39;所有10000个元素都不太可能生成恰好为10000个元素的哈希值,因此通常情况下,哈希映射远离#34; full")。因为"最近"哈希搜索不太可能与当前搜索匹配,缓存可能也没有多大帮助。
当然,顾名思义,std::unordered_map
是无序的 - 如果你遍历它,那么密钥是按哈希顺序排列的(模数桶计数,所以即使你知道哈希,它& #39;通常很难知道它是什么顺序),而不是"排序"订购。在某些情况下这很重要。
因此,无论是否能为您带来明显的性能优势,您都必须通过衡量性能来确定这一点。
答案 1 :(得分:0)
这里的区别在于map
内部使用red black tree而无序地图是hash table。与unordermap
相比,map
非常快,因为将元素放入地图只需要1(O(1))个“动作”,其中地图需要在树中找到正确的位置来存储放入地图的值(O(log n))。您还可以阅读map和unordermap