STL中的BST实现

时间:2011-09-12 06:24:19

标签: c++ stl

  

C ++ STL“set”和“map”支持插入的logarthmic最坏情况时间,   擦除,并查找操作。因此,潜在的实施是   二进制搜索树。实现集合和映射的一个重要问题是   为迭代器类提供支持。当然,在内部   迭代器维护指向迭代器中“当前”节点的指针。   困难在于有效地推进到下一个节点。

我的问题是

  1. 如果“set”和“map”实现了二进制搜索树,我们如何使用迭代器类前进到下一个节点,即我们返回++或 - 即,是左子树还是右子树?

  2. 一般来说,大多数STL如何实现BST以及如何实现++或 - 迭代器?

  3. 谢谢!

3 个答案:

答案 0 :(得分:6)

  1. C ++规范中没有任何内容要求使用二叉树。因此,++和 - 是根据元素序列定义的。 mapset存储有序元素序列。因此,++将转到下一个元素,并且 - 将转到上一个元素。下一个和前一个元素由元素的顺序定义。

    请注意,虽然C ++规范不需要使用二叉树,但特定的性能要求几乎会强制使用二叉树。

  2. 通常,他们使用Red/Black self-balancing binary tree中的一些。

答案 1 :(得分:1)

主要取决于具体的实施方式。 一种方式(仅限我的描述:不一定是您拥有的那种)可以是:

一个节点有3个指针: left right up ++的作用是:

  • 如果有“正确”,请向右走,而不是尽可能地离开最深处。
  • 否则上去,直到我们从右边来,然后再来一次。

--完全相反。

答案 2 :(得分:0)

除了最坏的情况,操作复杂性既有地图也有。 set(以及C ++标准库中的所有Orderer / Sorted Associative Containers)都有一个非常重要的属性:它们的元素总是按键排序(根据比较器)。
一个自平衡的二元搜索树可以满足操作的复杂性,只有遍历排序顺序的元素就是你已经猜到的in-order一个。 Nicol Bolas的回答为您提供了有关常规实施的更多详细信息。如果您真的想要实际看到这样的实现,那么您可以对RDE STL实现有所了解。  它比您在普通C ++标准库实现中找到的内容更容易阅读。作为旁注,两者都是& RDESTL中的map实现只有前向迭代器(不像标准所说的那样是双向的),但是应该很容易找出 - 部分。