在C ++ STL中,有两个map,map和hashmap。有人知道它们的主要区别吗?
答案 0 :(得分:42)
map使用红黑树作为数据结构,因此放在那里的元素是排序的,插入/删除是O(log(n))。元素需要至少实现operator<
。
hashmap使用散列,因此元素未排序,插入/删除为O(1)。元素需要至少实现operator==
,并且您需要一个哈希函数。
答案 1 :(得分:39)
hash_map使用哈希表。这在理论上是“恒定的”时间。大多数实现使用“碰撞”哈希表。现实中发生的事情是:
理论上说,如果你有足够大的表,操作是恒定的时间,即它不依赖于你拥有的实际元素的数量。当然,在实践中,你遇到的元素越多,碰撞就越多。
std :: map使用二叉树。没有必要为对象定义哈希函数,只需严格排序比较。在插入时,它向下递归树以找到插入点(以及是否有任何重复项)并添加节点,并且可能需要重新平衡树以使叶子的深度永远不会超过1。重新平衡时间也相对于树的深度,因此所有这些操作都是O(log N),其中N是元素的数量。
哈希的优点是复杂性 树的优点是:
std::map
的另一个问题是它使用单个严格排序的比较函数,而返回-1,0或1的“比较”函数效率会更高,特别是对于最常用的key类型,std :: string,已经实现了这个函数(它是char_traits::compare
)。 (这种效率低下的前提是要检查x==y
,检查x<y
和y<x
,这样就可以进行两次比较。每次查找只执行一次。)
答案 2 :(得分:7)
map
是红黑树,O(log(n))
访问时间。 hash_map
(这不是标准的,但unordered_map
将成为标准)使用(概念上)密钥的哈希作为链表列表中的索引,因此具有最佳的访问时间O(1)
以及O(n)
的最坏情况。
答案 3 :(得分:4)
主要区别在于搜索时间。
对于少数数据来说是更好的地图
对于大量数据来说是更好的hashmap
无论如何,之前给出的技术答案是正确的。