标签:des style class code color width
typedef
bool
__rb_tree_color_type;
// 标识红黑树节点颜色的类型
const
__rb_tree_color_type __rb_tree_red =
false
;
const
__rb_tree_color_type __rb_tree_black =
true
;
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;
// RB树的许多操作必须知道父节点
base_ptr left;
// 指向左儿子
base_ptr right;
// 指向右儿子
static
base_ptr minimum(base_ptr x)
{
// 二叉搜索树特性
while
(x->left != 0) x = x->left;
return
x;
}
static
base_ptr maximum(base_ptr x)
{
// 二叉搜索树特性
while
(x->right != 0) x = x->right;
return
x;
}
};
template
<
class
Value>
struct
__rb_tree_node :
public
__rb_tree_node_base
{
typedef
__rb_tree_node<Value>* link_type;
Value value_field;
// 节点值
};
struct
__rb_tree_base_iterator
{
typedef
__rb_tree_node_base::base_ptr base_ptr;
typedef
bidirectional_iterator_tag iterator_category;
// 双向迭代器
typedef
ptrdiff_t
difference_type;
base_ptr node;
// 迭代器和节点之间的纽带
void
increment()
// 迭代器++时使用
{
....
}
void
decrement()
// 迭代器--时使用
{
....
}
};
template
<
class
Value,
class
Ref,
class
Ptr>
struct
__rb_tree_iterator :
public
__rb_tree_base_iterator
{
typedef
Value value_type;
typedef
Ref reference;
typedef
Ptr pointer;
typedef
__rb_tree_iterator<Value, Value&, Value*> iterator;
typedef
__rb_tree_iterator<Value,
const
Value&,
const
Value*> const_iterator;
typedef
__rb_tree_iterator<Value, Ref, Ptr> self;
typedef
__rb_tree_node<Value>* link_type;
// 指向上层节点的指针
__rb_tree_iterator() {}
__rb_tree_iterator(link_type x) { node = x; }
// 初始化node
__rb_tree_iterator(
const
iterator& it) { node = it.node; }
reference operator*()
const
{
return
link_type(node)->value_field; }
// 解引用,注意
link_type类型转换
pointer operator->()
const
{
return
&(operator*()); }
// 箭头操作符
self& operator++() { increment();
return
*
this
; }
self operator++(
int
) {
....
}
self& operator--() { decrement();
return
*
this
; }
self operator--(
int
) {
....
}
};
template
<
class
Key,
class
Value,
class
KeyOfValue,
class
Compare,
class
Alloc = alloc>
class
rb_tree {
....
typedef
__rb_tree_node<Value> rb_tree_node;
typedef
simple_alloc<rb_tree_node, Alloc> rb_tree_node_allocator;
// 空间配置器,一次分配一个节点
typedef
rb_tree_node* link_type;
link_type get_node() {
return
rb_tree_node_allocator::allocate(); }
// 获得一个节点空间
void
put_node(link_type p) { rb_tree_node_allocator::deallocate(p); }
// 释放一个节点空间
link_type create_node(
const
value_type& x) {
// 分配并构造一个节点
link_type tmp = get_node();
construct(&tmp->value_field, x);
return
tmp;
}
....
void
destroy_node(link_type p) {
// 析构并释放一个节点
destroy(&p->value_field);
put_node(p);
}
protected
:
size_type node_count;
// 记录节点数量
link_type header;
// 使用上的一个技巧
Compare key_compare;
// 键值大小比较准则
....
static
link_type& left(link_type x) {
return
(link_type&)(x->left); }
// 左儿子
static
link_type& right(link_type x) {
return
(link_type&)(x->right); }
// 右儿子
....
static
link_type minimum(link_type x) {
return
(link_type) __rb_tree_node_base::minimum(x);
// 调用底层节点的函数获得键值最小的节点
}
static
link_type maximum(link_type x) {
return
(link_type) __rb_tree_node_base::maximum(x);
// 调用底层节点的函数获得键值最大的节点
}
....
public
:
pair<iterator,
bool
> insert_unique(
const
value_type& x);
// 节点键值独一无二
iterator insert_equal(
const
value_type& x);
// 节点键值可重复性
void
erase(iterator position);
// 删除节点
....
public
:
// 以下函数在multimap和multiset中使用
iterator find(
const
key_type& x);
size_type count(
const
key_type& x)
const
;
iterator lower_bound(
const
key_type& x);
iterator upper_bound(
const
key_type& x);
pair<iterator,iterator> equal_range(
const
key_type& x);
}
link_type& root()
const
{
return
(link_type&) header->parent; }
link_type& leftmost()
const
{
return
(link_type&) header->left; }
link_type& rightmost()
const
{
return
(link_type&) header->right; }
void
init() {
// 初始化header
header = get_node();
color(header) = __rb_tree_red;
// used to distinguish header from
// root, in iterator.operator--
root() = 0;
// header->parent = null
leftmost() = header;
rightmost() = header;
}
iterator begin() {
return
leftmost(); }
// header->left
iterator end() {
return
header; }
// 返回header,调用__rb_tree_iterator构造函数由指针转迭代器
关联容器(底层机制) — 红黑树,布布扣,bubuko.com
标签:des style class code color width
原文地址:http://blog.csdn.net/nestler/article/details/25196283