【问题标题】:why stl choose tree based map instead of hash based map?为什么 stl 选择基于树的地图而不是基于哈希的地图?
【发布时间】:2012-03-22 06:58:23
【问题描述】:

我想知道为什么 STL 的地图是基于 rb 树的? 我的意思是,基于哈希的映射在插入/删除甚至获取值方面似乎更有效。 有什么具体的考虑吗?

【问题讨论】:

  • 我只能猜测树可以保证良好的时间复杂度,而基于散列的映射可能会根据散列函数和输入产生非常差的结果

标签: c++ stl map


【解决方案1】:

STL 最初选择了两者。它有一个哈希表基于树的映射。

然而,当它被采纳到标准中时,为了简化任务,许多部分被剥离(更容易说服委员会包含一个更小的库,并且在实际指定它们的行为方面需要更少的工作)。

所以哈希表被跳过了。

不过,这两种数据结构都有各自的优势。特别是,二叉树允许地图的内容有序(您可以按排序顺序遍历地图的内容,或者您​​可以要求所有小于特定元素的元素,例如例如),我只能猜测这个属性被认为比哈希映射的性能优势更重要。

但是,在 C++11 中,添加了std::unordered_map,这是丢失已久的哈希表。它最初的遗漏仅仅是由于时间压力,很可能是由于委员会政治(保持图书馆规模小,以尽量减少对它的阻力)

【讨论】:

  • 这并不能解释为什么 Stepanov(大概)将他的基于树的映射命名为“map”和哈希映射命名为“hashmap”(由于历史/政治原因,它现在只命名为 unordered_map),并且它也没有解释为什么标准委员会最初选择基于树的地图,而放弃了另一个——但它确实解释了历史,所以它从我那里得到了+1
  • 嗯,保持库小是重点,但忽略像哈希表这样基本的数据结构总是让我对标准委员会的决定摇头。多年后他们终于纠正了这个错误,对我来说std::unordered_map(和它的同事),作为基本的可能(或者更确切地说是因为这个),是 C++11 库添加的最重要的特性之一。但是足够的主观性,实际答案+1,当然有序地图也有其优势。
  • @Christian:(后期)将 STL 并入标准库已经将标准延迟了至少一年,也许两年。参与其中的每个人都知道他们正在削减重要的东西,但他们也想最终发布一个标准,而不是在第二个十年的基础上工作,直到发布十年前完美的东西。您需要知道,当时每个编译器都带有自己的流库,所有这些都略有不兼容。我们有大约六个流行的容器和/或算法库。鉴于此,标准是天赐之物。
猜你喜欢
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
  • 2010-09-05
  • 2016-09-16
  • 1970-01-01
  • 2018-01-02
相关资源
最近更新 更多