为什么C ++集实现为二叉树而不是哈希集,与二叉树提供的O(log n)相比,它可以提供O(1)的平均大小写复杂度?
答案 0 :(得分:16)
因为C ++集是由T
的比较运算符排序的,这使得以可预测的方式迭代成员成为可能。如果您知道您将对该集合执行的操作是插入,测试成员资格和/或删除元素,那么实现哈希集的std::unordered_set
就存在于C ++ 11之后。
答案 1 :(得分:9)
答案 2 :(得分:1)
这里有两个因素:
unordered_set
以下讨论这些要点。
有许多优点/缺点,两者都可用(从C ++ 11开始)让程序员选择。基于哈希的集合不可用,因为它们没有及时就实施达成一致意见,以便将它们纳入早期标准。
set
迭代按排序顺序排列,而散列容器unsorted_set
实际上是随机顺序遍历
set
支持lower_bound
,upper_bound
,这些内容在unsorted_set
上无法提供set
使用比较函数(默认情况下包含的类型为operator<
,而unordered_set
需要散列函数(某些类型提供默认值,但它们可能非常平庸,具体取决于您的实际密钥和质量哈希可能很耗时)和密钥相等功能std::unordered_set
中的现有迭代器可能会失效(确切地见23.2.5p14),而std::map
中的迭代器永远不会被插入(指针和对{的引用无效) {1}}元素仍然有效。)来自Stepanov的采访:
问题:我在D.Musser站点中找到了两个哈希表实现,它们都工作且相当聪明 - 比类库中常见的哈希表更聪明。为什么哈希表没有包含在STL中?
答案:政治。它们必须在。我们的STL新实现确实包含它们。通常,我们需要开发一种向STL添加内容的机制。毕竟,STL是一个可扩展的框架,它需要扩展。有许多数据结构缺失,例如,单链表,矩阵和图形。 SGI愿意在扩展STL方面处于领先地位。