C++ 为什么C++;STL使用RBtree实现;std::map";?

C++ 为什么C++;STL使用RBtree实现;std::map";?,c++,stl,std,C++,Stl,Std,现在我正在寻找python源代码,我发现python和C都使用哈希实现字典 散列的时间复杂度是O(1),RBtree是O(lgn),所以有人能告诉我为什么C++STL使用RBtree来实现std::map,因为它有一个单独的散列表容器:std::unordered\u map。还要注意.NET除了词典< > < /p> < p>之外,还可以在“标准C++库,教程和参考”中找到答案,这里可以在网上找到: 简短的引语解释: 总的来说,整个标准(语言和库)是经过大量讨论和实践的结果 来自世界各地数百

现在我正在寻找python源代码,我发现python和C都使用哈希实现
字典


散列的时间复杂度是
O(1)
RBtree
O(lgn)
,所以有人能告诉我为什么
C++STL
使用
RBtree
来实现
std::map
,因为它有一个单独的散列表容器:
std::unordered\u map
。还要注意.NET除了<代码>词典< <代码> > < /p> < p>之外,还可以在“标准C++库,教程和参考”中找到答案,这里可以在网上找到: 简短的引语解释:

总的来说,整个标准(语言和库)是经过大量讨论和实践的结果 来自世界各地数百人的影响。例如,日本人提出了 对国际化的重要支持。当然,犯了错误,改变了主意, 人们有不同的看法。然后,在1994年,当人们认为标准接近 完成后,STL被合并,这从根本上改变了整个图书馆。但是, 完成后,关于主要扩展的想法最终停止了,不管如何 扩展将是有用的。因此,哈希表不是标准的一部分,尽管它们 应作为通用数据结构作为STL的一部分


显然自从那个时候C++ 11已经出来了,因为名称<代码> map < /Cord>已经被使用,并且 Hasymap MAP>代码>是一个已经通过通用扩展库广泛使用的名称(例如,GyuGuxCx::Hasymap),为哈希映射选择了名称

unordered\u map

您可能需要提到
std::map
(即正在排序)的附加要求,这使得它不同于
字典
,等于
SortedDictionary
。谢谢,因此在RBtree中可以挑选出特定范围内的所有项目,但是在哈希表中我们不能这样做,对吗?“哈希的时间复杂度是O(1)”-在最好的情况下。最坏的情况仍然是O(n)。rb树使用平衡技术实现所有情况下的log(n)。当然,还有顺序上的差异。@lai是的,你可以使用std::map中的下界来获得排序范围。@innochenti:当然正确,但实际上我怀疑你是否真的会达到O(n)的情况。你不应该被渐近性蒙蔽。BST和哈希表是非常不同的数据结构,通过测量,您只能真正知道哪一种更适合您的问题。由于哈希表对键类型的要求更高,也更复杂,因此基于树的有序映射是关联容器更自然的首选,但从C++11开始,我们两者都有。