在C ++中使用map和hash_map
我有一个hash_map
和C + +的map
的问题。 我明白, map
是在STL,但hash_map
不是一个标准。 两者有什么区别?
它们以非常不同的方式实施。
hash_map
(TR1和Boost中的unordered_map
;使用它们)使用散列表,其中密钥被散列到表中的一个槽中,并且该值存储在与该密钥相关的列表中。
map
被实现为平衡二叉search树(通常是红/黑树)。
一个unordered_map
应该给访问集合的已知元素提供稍微好一点的性能,但是一个map
还会有其他有用的特性(例如它按照sorting顺序存储,这样就可以从头到尾遍历)。 unordered_map
插入和删除的速度比map
快。
hash_map
是许多库实现提供的常见扩展。 这就是为什么当它作为TR1的一部分被添加到C ++标准中时它被重命名为unordered_map
。 地图通常用红黑树等平衡二叉树来实现(实现方式各不相同)。 hash_map
和unordered_map
通常使用哈希表来实现。 因此订单不被维护。 unordered_map
插入/删除/查询将是O(1)(常量时间)其中映射将是O(log n)其中n是数据结构中的项目数。 所以unordered_map
更快,如果你不关心项目的顺序应该优先于map
。 有时你想保持秩序(按键sorting),并为该map
将是select。
一些关键的区别在于复杂性要求。
映射需要O(log(N))时间来插入和查找。
unordered_map需要O(1)的“平均”时间来插入和查找,但是允许其最坏情况时间为O(N)。
所以,通常,unordered_map会更快,但取决于您存储的密钥和哈希函数,可能会变得更糟糕。
C ++规范并没有说明你必须使用什么algorithm来为STL容器。 但是,它确实对性能施加了一定的限制,这就排除了对map
和其他关联容器使用散列表的限制。 (它们通常用红色/黑色树来实现)。这些约束要求这些容器比散列表可以提供更好的最差情况下的性能。
许多人确实需要散列表,但是,基于散列的STL关联容器已经是多年来的常见扩展。 因此,他们将unordered_map
等添加到C ++标准的更高版本中。
我不知道给出了什么,但是,hash_map需要超过20秒来清除()150K无符号整数键和浮点值。 我只是在跑步,阅读别人的代码。
这是它如何包含hash_map。
#include "StdAfx.h" #include <hash_map>
我在这里读到https://bytes.com/topic/c/answers/570079-perfomance-clear-vs-swap
说clear()是O(N)的顺序。 对我来说,这是非常奇怪的,但是,就是这样。