我们可以从几个来源看到std :: map是使用红黑树实现的。据我了解,这些类型的数据结构不以任何特定顺序保存其元素,只保留BST属性和高度平衡要求。
那么,map :: begin是如何定时的,我们能够迭代一个有序的序列吗?
答案 0 :(得分:3)
从std::map
内部维护BST的前提开始(标准并非严格要求,但大多数库可能会这样做,如红黑树)。
在BST中,要找到最小的元素,您只需跟随左侧分支,直到到达叶子,即O(log(N))。但是,如果你想提供" begin()"在恒定时间内迭代器,在内部跟踪最小元素是非常简单的。每次插入导致最小元素发生变化时,您都会更新它,这就是全部。当然,这是内存开销,但这是一种权衡。
可能还有其他方法来挑出最小的元素(比如保持根节点不平衡)。无论哪种方式,都不难做到。
迭代"命令"序列,您只需要对树进行有序遍历。从最左边的叶子节点开始,你可以(向上),(向右),(向上,向上),(向右),......等等......它是一套简单的规则,它是一个简单的规则。很容易实现,只是我写了一段时间的see a quick implementation of a simple BST inorder iterator。在进行有序遍历时,您将按正确的顺序访问从最小到最大的每个节点。换句话说,它只是给你一种错觉,即" array"是排序的,但实际上,它的遍历使它看起来像它的排序。
答案 1 :(得分:2)
红黑树的平衡属性允许您以O(log N)成本在树中的任何位置插入节点。对于典型的std::map
实现,容器将对树进行排序,并且每当插入新节点时,将其插入到正确的位置以保持树的排序,然后重新平衡树以保持红黑属性。
所以不,红黑树本身并没有分类。
答案 2 :(得分:0)
RB树是二叉搜索树。二进制搜索树不一定以任何特定的顺序存储它们的元素,但是您总是可以进行顺序遍历。我不确定map :: begin如何保证恒定时间,我假设这总是要记住最小元素的路径(通常它是O(log(n)))。 / p>