STL源码剖析(十三)关联式容器之rb_tree
文章目录
rt_tree是红黑树,在STL中,它并没有对使用者开放,但它非常重要,它作为set和map的底部支持
这篇文章不详细讨论红黑树的算法,着重讲解STL中红黑树的数据结构,如果需要了解红黑树,可以阅读 数据结构与算法之树(四)红黑树
一、rb_tree的数据结构
template <class Key, class Value, class KeyOfValue, class Compare,
class Alloc = alloc>
class rb_tree {
...
proteced:
typedef __rb_tree_node<Value> rb_tree_node;
...
public:
typedef rb_tree_node* link_type;
...
protected:
size_type node_count; // keeps track of size of tree
link_type header;
Compare key_compare;
...
};
rb_tree 中有三个成员变量,node_count 表示红黑树中的节点个数,header 表示头节点(这是STL红黑树的一个特性),key_compare 是一个仿函数,用于比较键值的大小,别忘了红黑树是一种二叉搜索树,是有序的,所以需要有一个比较节点的方法
rb_tree 的节点定义如下
struct __rb_tree_node_base
{
typedef __rb_tree_color_type color_type;
typedef __rb_tree_node_base* base_ptr;
color_type color;
base_ptr parent;
base_ptr left;
base_ptr right;
}
template <class Value>
struct __rb_tree_node : public __rb_tree_node_base
{
typedef __rb_tree_node<Value>* link_type;
Value value_field;
};
每个节点有颜色 color,有父节点 parent,有左孩子 left,有右孩子 right,还有对应的值 vlur_field
rb_tree的红黑树是经过改造的,跟普通的红黑树还是有点区别,主要是多了 header节点,需要注意的是 header 不是根节点,是一个头节点,如下图所示

header 节点和根节点互为父节点,header 节点的左子节点指向红黑树最左边的节点,header 节点的右子节点指向红黑树最右边的节点
二、rb_tree的迭代器
struct __rb_tree_base_iterator
{
}
template <class Value,
最低0.47元/天 解锁文章
656

被折叠的 条评论
为什么被折叠?



