STL中map和hashmap的区别是什么 在C++ STL中,有两个映射、映射和哈希映射。有人知道它们的主要区别吗?

STL中map和hashmap的区别是什么 在C++ STL中,有两个映射、映射和哈希映射。有人知道它们的主要区别吗?,c++,stl,C++,Stl,map是一棵红黑树,O(log(n))访问时间hash\u-map(这不是标准的,但是unordered\u-map将成为标准的)使用(概念上)键的散列作为链接列表数组中的索引,因此最佳情况下的访问时间为O(1),最坏情况下的访问时间为O(n) 请参见地图使用红黑树作为数据结构,因此您放入其中的元素已排序,插入/删除为O(log(n))。元素至少需要实现操作符,主要区别在于搜索时间 因为很少有数据比地图更好 对于大量数据,hashmap更好 无论如何,前面给出的技术答案都是正确的。哈希映射使用哈

map
是一棵红黑树,
O(log(n))
访问时间
hash\u-map
(这不是标准的,但是
unordered\u-map
将成为标准的)使用(概念上)键的散列作为链接列表数组中的索引,因此最佳情况下的访问时间为
O(1)
,最坏情况下的访问时间为
O(n)


请参见

地图使用红黑树作为数据结构,因此您放入其中的元素已排序,插入/删除为O(log(n))。元素至少需要实现
操作符,主要区别在于搜索时间

因为很少有数据比地图更好

对于大量数据,hashmap更好


无论如何,前面给出的技术答案都是正确的。

哈希映射使用哈希表。这在理论上是“恒定”时间。大多数实现使用“冲突”哈希表。实际情况是:

  • 它创造了一个大桌子
  • 您的对象有一个“hash”函数,它在表中生成一个随机位置(看起来是随机的,但hash函数将始终为您的对象返回相同的值),通常这是实际32位(或64位)hash值与表大小的mod
  • 该表查看空间是否可用。如果是,则将该项放在表中。如果不是,它会检查那里的元素是否就是您试图插入的元素。如果是,则为重复,因此不插入。如果没有,则称为“碰撞”,它使用一些公式来查找另一个单元格,并一直持续到找到重复单元格或空单元格为止
  • 当表格填满太多时,它会调整大小。一个高效的(及时的)实现将所有原始散列值与元素一起存储,这样在执行此操作时就不需要重新计算散列值。此外,比较散列通常比比较元素快,因此它可以在搜索时这样做,以消除大部分冲突,作为预步骤
  • 如果你从不删除任何东西,那很简单。但是,删除元素会增加额外的复杂性。一个单元格中有一个已被删除的元素,它与一直为空的单元格处于不同的状态,因为可能会发生冲突,如果只是将其清空,则找不到这些元素。所以通常会有一些“标记”。当然,现在当我们想要重用单元格时,我们仍然必须向下递归,以防出现重复的向下循环(在这种情况下,我们无法插入此单元格),然后记住重用已删除的单元格
  • 通常的约束条件是,必须实现对象以检查相等性,但Dinkumware(或者是SGI)使用运算符<实现了它们的相等性,运算符<可能较慢,但其优点是可以解耦元素和它们可以存储在的关联容器的类型,尽管您仍然需要一个散列函数来存储在散列中
理论上,如果你有一个足够大的表,那么操作是固定时间的,也就是说,它不依赖于你拥有的实际元素的数量。当然,在实践中,元素越多,发生的碰撞就越多

映射使用二叉树。无需为对象定义哈希函数,只需严格排序比较即可。插入时,它沿树向下递归以找到插入点(以及是否有任何重复点)并添加节点,并且可能需要重新平衡树,以便树叶的深度间隔永远不超过1。再平衡时间也与树的深度有关,因此所有这些操作都是O(logn),其中N是元素数

散列的优点是复杂性 该树的优点是:

  • 完全可扩展。它只使用它所需要的,不需要一个巨大的表或预先占用表的大小,尽管哈希可能比树需要更少的每个元素的“行李”
  • 不需要首先散列,对于一个好的函数来说,如果数据集不大,那么比较可能需要更长的时间

std::map
的另一个问题是,它使用一个严格排序的比较函数,而返回-1、0或1的“compare”函数效率更高,特别是对于最常用的键类型std::string,它已经实现了这个函数(它是
char\u traits::compare
)。(这种效率低下的前提是,要检查
x==y
,您需要检查
xformap,元素是否需要支持==?@user:No,
std::map
使用基于
运算符的等价来澄清:等价意味着
!(a随着元素的数量变得天文数字,您的性能评论越来越正确,但如果使用几千甚至几百万个元素,则很可能是错误的……所有这些都取决于创建哈希值的相对速度与键比较、冲突和冲突处理技术。一如既往,如果您能够关于我提到的上一个问题,对于关联容器映射和集合,更有效的比较策略可能是std::compare或返回-1、0或1的任何内容。可以创建使用(因为有一些提供HHSHMAP的STL供应商,它们不一样,当被添加到C++标准时,它被称为无序的映射。