C ++ STL“set”和“map”支持插入的logarthmic最坏情况时间, 擦除,并查找操作。因此,潜在的实施是 二进制搜索树。实现集合和映射的一个重要问题是 为迭代器类提供支持。当然,在内部 迭代器维护指向迭代器中“当前”节点的指针。 困难在于有效地推进到下一个节点。
我的问题是
如果“set”和“map”实现了二进制搜索树,我们如何使用迭代器类前进到下一个节点,即我们返回++或 - 即,是左子树还是右子树?
一般来说,大多数STL如何实现BST以及如何实现++或 - 迭代器?
谢谢!
答案 0 :(得分:6)
C ++规范中没有任何内容要求使用二叉树。因此,++和 - 是根据元素序列定义的。 map
和set
存储有序元素序列。因此,++将转到下一个元素,并且 - 将转到上一个元素。下一个和前一个元素由元素的顺序定义。
请注意,虽然C ++规范不需要使用二叉树,但特定的性能要求几乎会强制使用二叉树。
通常,他们使用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实现只有前向迭代器(不像标准所说的那样是双向的),但是应该很容易找出 - 部分。