C ++ STL设置实现

时间:2013-05-14 04:30:05

标签: c++ algorithm data-structures stl

为什么C ++集实现为二叉树而不是哈希集,与二叉树提供的O(log n)相比,它可以提供O(1)的平均大小写复杂度?

3 个答案:

答案 0 :(得分:16)

因为C ++集是由T的比较运算符排序的,这使得以可预测的方式迭代成员成为可能。如果您知道您将对该集合执行的操作是插入,测试成员资格和/或删除元素,那么实现哈希集的std::unordered_set就存在于C ++ 11之后。

答案 1 :(得分:9)

根据John Nagle的说法,从2006年发布到comp.lang.c++.moderated

  

实际的原因是写作的人   哈希表部分规范没有及时完成。   就是这样。

标准化过程就是这样。

答案 2 :(得分:1)

这里有两个因素:

  • 二叉树和基于散列的关联集都很有用
  • 由于没有时间通过​​标准化的“政治”工作,原来的STL只实施了前者; SGI,GNU,MS,boost和其他人多年来一直提供非标准的基于散列的版本,而C ++ 11引入了unordered_set

以下讨论这些要点。

两者都有用

有许多优点/缺点,两者都可用(从C ++ 11开始)让程序员选择。基于哈希的集合不可用,因为它们没有及时就实施达成一致意见,以便将它们纳入早期标准。

  • set迭代按排序顺序排列,而散列容器unsorted_set实际上是随机顺序遍历
    • set支持lower_boundupper_bound,这些内容在unsorted_set上无法提供
  • set使用比较函数(默认情况下包含的类型为operator<,而unordered_set需要散列函数(某些类型提供默认值,但它们可能非常平庸,具体取决于您的实际密钥和质量哈希可能很耗时)和密钥相等功能
  • 对于较小的N值可能更快 - 不是每个人都在处理数十亿元素,因此即使从绩效角度提供选择也是明智的
  • 小型对象的内存使用量可能存在显着差异,但我不确定在各种实现中哪些总体指导方针是正确的,因此如果您愿意,可以建议在您的程序中进行测量
  • 在添加元素时,std::unordered_set中的现有迭代器可能会失效(确切地见23.2.5p14),而std::map中的迭代器永远不会被插入(指针和对{的引用无效) {1}}元素仍然有效。)

为什么早期的C ++标准没有基于散列的集合

来自Stepanov的采访:

  

问题:我在D.Musser站点中找到了两个哈希表实现,它们都工作且相当聪明 - 比类库中常见的哈希表更聪明。为什么哈希表没有包含在STL中?

     

答案:政治。它们必须在。我们的STL新实现确实包含它们。通常,我们需要开发一种向STL添加内容的机制。毕竟,STL是一个可扩展的框架,它需要扩展。有许多数据结构缺失,例如,单链表,矩阵和图形。 SGI愿意在扩展STL方面处于领先地位。

http://www.stlport.org/resources/StepanovUSA.html完整访谈)