通过查看源代码(本例中为libstdC++ 5.2.1),我们可以找到确定的答案。这是一个树节点的模样:
// <libstdc++>/include/bits/stl_tree.h
struct _Rb_tree_node_base {
typedef _Rb_tree_node_base* _Base_ptr;
_Rb_tree_color _M_color;
_Base_ptr _M_parent;
_Base_ptr _M_left;
_Base_ptr _M_right;
// ...
}
所以每个节点包含颜色以及指向其父和其左右的孩子。递增被实现为:
// <libstdc++>/include/bits/stl_tree.h
struct _Rb_tree_iterator {
_Self& operator++() {
_M_node = _Rb_tree_increment(_M_node);
return *this;
}
// ...
private:
_Base_ptr _M_node;
};
的实际增量是不是在公众头了,但在库的编译部分:
// <libstdc++>/src/c++98/tree.cc
static _Rb_tree_node_base* local_Rb_tree_increment(_Rb_tree_node_base* __x) throw()
{
if (__x->_M_right != 0) {
__x = __x->_M_right;
while (__x->_M_left != 0)
__x = __x->_M_left;
} else {
_Rb_tree_node_base* __y = __x->_M_parent;
while (__x == __y->_M_right) {
__x = __y;
__y = __y->_M_parent;
}
if (__x->_M_right != __y)
__x = __y;
}
return __x;
}
所以,最终,它是一本教科书执行树遍历:迭代器持有一个指向“当前”节点的指针,并且只要它来自正确的子节点,就会到树中上一个节点。如果它来自左侧孩子,则会下降到右侧孩子的最左侧孩子节点。
我认为这可能是一个重复http://stackoverflow.com/questions/2558153/what-is-the-underlying-data-structure-of-a-stl-set-in-c – i4h
它不是上述问题的重复,基本上回答了我在这个问题中已经提到的信息 - 基础数据结构是R&B树。 – ralzaul