这对我来说很奇怪,我希望它是一个哈希表。
我在下面的答案中看到了3个理由(这可能是正确的,但我不认为它们是真正的原因)。 Hash tables v self-balancing search trees
虽然哈希可能不是一个简单的操作。我认为对于大多数类型而言,它非常简单。
当你使用地图时,你会期望能够分期付款的东西O(1)插入,删除,查找,而不是log(n)。
我同意树木的表现最差。
我认为有更大的理由,但我无法弄明白。 在c#例如,Dictionary是一个哈希表。
答案 0 :(得分:20)
这在很大程度上是一次历史性事故。标准容器(以及迭代器和算法)是冻结标准功能集之前的最后一个添加项之一。事实上,他们当时没有得到他们认为对基于哈希的地图的充分定义,并且在功能被冻结之前没有时间添加它,因此原始规范仅包含一个基于树的地图。
C ++ 11添加了std::unordered_map
(以及两者的std::unordered_set
和multi
版本),但它们基于哈希。
答案 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
。
这两个被称为什么,或者他们用其他语言调用的内容并不重要。