为什么std :: map是红黑树而不是哈希表?

时间:2014-03-26 15:33:56

标签: c++ std

这对我来说很奇怪,我希望它是一个哈希表。

我在下面的答案中看到了3个理由(这可能是正确的,但我不认为它们是真正的原因)。 Hash tables v self-balancing search trees

  1. 虽然哈希可能不是一个简单的操作。我认为对于大多数类型而言,它非常简单。

  2. 当你使用地图时,你会期望能够分期付款的东西O(1)插入,删除,查找,而不是log(n)。

  3. 我同意树木的表现最差。

  4. 我认为有更大的理由,但我无法弄明白。 在c#例如,Dictionary是一个哈希表。

4 个答案:

答案 0 :(得分:20)

这在很大程度上是一次历史性事故。标准容器(以及迭代器和算法)是冻结标准功能集之前的最后一个添加项之一。事实上,他们当时没有得到他们认为对基于哈希的地图的充分定义,并且在功能被冻结之前没有时间添加它,因此原始规范仅包含一个基于树的地图。

C ++ 11添加了std::unordered_map(以及两者的std::unordered_setmulti版本),但它们基于哈希。

答案 1 :(得分:16)

原因是map被明确地称为有序容器。它使元素保持排序,并允许您按线性时间的排序顺序进行迭代。哈希表无法满足这些要求。

在C ++ 11中,他们添加了std::unordered_map这是一个哈希表实现。

答案 2 :(得分:4)

哈希表需要额外的哈希函数。使用map的{​​{1}}的当前实现可以在没有额外散列函数的情况下使用operator<。此外,映射允许对元素进行排序访问,这对某些应用程序可能是有益的。使用C ++,我们现在可以以unordered_set的形式提供哈希版本。

答案 3 :(得分:1)

简单回答:因为哈希表不能满足std::map上迭代的复杂性要求。

为什么std::map符合这些要求?无法回答的问题。历史因素有助于总体而言,只是的方式。

哈希值为std::unordered_map

这两个被称为什么,或者他们用其他语言调用的内容并不重要。