对我来说,这很奇怪,我预期它是一个哈希表。
我在下面的答案中看到了3个原因(也许是正确的,但我不认为它们是真正的原因)。 哈希表与自平衡搜索树
虽然哈希可能不是一个简单的操作。但我认为对于大多数类型来说,它都是相当简单的。
当你使用map时,你期望得到的是一种可以提供摊销O(1)插入、删除和查找的东西,而不是log(n)。
我同意树在最坏情况下的性能更好。
我认为还有一个更大的原因,但我想不出来。 例如,在C#中,Dictionary就是一个哈希表。
对我来说,这很奇怪,我预期它是一个哈希表。
我在下面的答案中看到了3个原因(也许是正确的,但我不认为它们是真正的原因)。 哈希表与自平衡搜索树
虽然哈希可能不是一个简单的操作。但我认为对于大多数类型来说,它都是相当简单的。
当你使用map时,你期望得到的是一种可以提供摊销O(1)插入、删除和查找的东西,而不是log(n)。
我同意树在最坏情况下的性能更好。
我认为还有一个更大的原因,但我想不出来。 例如,在C#中,Dictionary就是一个哈希表。
这在很大程度上是历史原因。标准容器(以及迭代器和算法)是在标准的功能集被固定之前添加的最后一个元素。恰好在那时,他们并没有对哈希映射有足够充分的定义,也没有时间在功能集固定之前添加它。因此,最初的规范只包括基于树的映射。
C++11添加了std::unordered_map
(以及std::unordered_set
和两者的multi
版本),其基于哈希。
原因是map
被明确指定为有序容器,它保持元素排序并允许您按排序顺序进行线性迭代。哈希表无法满足这些要求。
在C++11中,他们添加了std::unordered_map
,它是一个哈希表实现。
map
的实现不是哈希表”。也许楼主可以澄清他们实际的问题。 - Mark Bmap
的复杂度要求?(我们同意它不强制使用红黑树) - Mark Bmap
可以通过使用 operator<
而不需要额外的哈希函数来工作。此外,map 允许对元素进行排序访问,这可能对某些应用程序有益。在 C++ 中,我们现在可以使用哈希版本,形式为 unordered_set。==
是任何容器的要求。 - MatthiasBstd::find
)。需要进行相等比较的容器使用<
来实现:(!a<b) && (!b<a) 意味着 a==b。 - Jerry Coffin<
和==
运算符定义的。其他比较运算符:!=
、>
、<=
和>=
可以通过<
和==
来定义。STL utility.h
头文件被指定为自动实现此功能的位置。 - CPlusPlus OOA and Dstd::map
不直接使用 operator<
,而是有两个间接操作:I)std::map<K, V>
只是 std::map<K, V, std::less<K>>
的简写;II)std::less
的默认实现使用 operator<
。因此,您可以为某个类型 X
专门指定 std::less<X>
,以使用其他内容而不是 operator<
,或者(更现实的情况)可以显式地使用不同的比较器参数化映射,例如 std::map<K, V, std::greater<K>>
以按降序存储键。 - fredoverflow==
不会有任何区别。一个不定义 <
的类型只有在你(尝试)实例化 map 时指定比较时才会编译。 - Jerry Coffinstd::map
进行迭代的复杂度要求。std::map
有这些要求?这是一个无法回答的问题。历史因素起到了一定作用,但总体来说,“就是这样”。std::unordered_map
实现。
std::unordered_map
来实现哈希表的映射。 - segfault