STL源码剖析(十三)关联式容器之rb_tree

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,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值