【发布时间】:2012-03-22 06:58:23
【问题描述】:
我想知道为什么 STL 的地图是基于 rb 树的? 我的意思是,基于哈希的映射在插入/删除甚至获取值方面似乎更有效。 有什么具体的考虑吗?
【问题讨论】:
-
我只能猜测树可以保证良好的时间复杂度,而基于散列的映射可能会根据散列函数和输入产生非常差的结果
我想知道为什么 STL 的地图是基于 rb 树的? 我的意思是,基于哈希的映射在插入/删除甚至获取值方面似乎更有效。 有什么具体的考虑吗?
【问题讨论】:
STL 最初选择了两者。它有一个哈希表和基于树的映射。
然而,当它被采纳到标准中时,为了简化任务,许多部分被剥离(更容易说服委员会包含一个更小的库,并且在实际指定它们的行为方面需要更少的工作)。
所以哈希表被跳过了。
不过,这两种数据结构都有各自的优势。特别是,二叉树允许地图的内容有序(您可以按排序顺序遍历地图的内容,或者您可以要求所有小于特定元素的元素,例如例如),我只能猜测这个属性被认为比哈希映射的性能优势更重要。
但是,在 C++11 中,添加了std::unordered_map,这是丢失已久的哈希表。它最初的遗漏仅仅是由于时间压力,很可能是由于委员会政治(保持图书馆规模小,以尽量减少对它的阻力)
【讨论】:
unordered_map),并且它也没有解释为什么标准委员会最初选择基于树的地图,而放弃了另一个——但它确实解释了历史,所以它从我那里得到了+1。
std::unordered_map(和它的同事),作为基本的可能(或者更确切地说是因为这个),是 C++11 库添加的最重要的特性之一。但是足够的主观性,实际答案+1,当然有序地图也有其优势。