STL源码剖析 容器 stl_tree.h

来源:互联网 发布:分手后做朋友 知乎 编辑:程序博客网 时间:2024/05/22 14:44

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie


RB-tree(红黑树)

--------------------------------------------------------------------------

平衡二叉搜索树 --> 平衡可提高搜索效率
常见的平衡二叉搜索树有:
AVL-tree(任何节点的左右子树高度相差最多 1)、红黑树、AA-tree

AVL-tree 
破坏平衡的情况及恢复平衡的方法
恢复时要先找到失去平衡的点
外侧插入 --> 单旋转
内侧插入 --> 双旋转  




红黑树是一种平衡二叉搜索树,并满足以下规则:
1.每个节点不是红色就是黑色
2.根节点为黑色
3.如果节点为红,子节点必须为黑 --> 新增节点的父节点必须为黑
4.任一节点至 NULL 的任何路径,所含的黑节点数必须相同 --> 新增节点必须为红
如果新节点根据二叉搜索树的规则到达其插入点,却未能符合上述条件,必须调整颜色并旋转树形

// 不懂红黑树的实现为什么要采用双层架构的形式,有什么好处?

#ifndef __SGI_STL_INTERNAL_TREE_H#define __SGI_STL_INTERNAL_TREE_H#include <stl_algobase.h>#include <stl_alloc.h>#include <stl_construct.h>#include <stl_function.h>__STL_BEGIN_NAMESPACE typedef bool __rb_tree_color_type;const __rb_tree_color_type __rb_tree_red = false;  //红色为0const __rb_tree_color_type __rb_tree_black = true; //黑色为1struct __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-tree 的各种操作时常需要上溯其你节点,所以要特别在数据结构中安排一个 parent 指针  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() //逻辑有点复杂,画张图看看比较好懂  {    if (node->right != 0) {   //如果有右子节点       node = node->right;     //就向右走      while (node->left != 0) //然后一直往左子树走到底        node = node->left;    //既是解答    }    else {      //没有右子节点        base_ptr y = node->parent;  //找到父节点      while (node == y->right) {  //如果现行节点本身是个右子节点        node = y;  //就一直上溯,直到"不为右子节点"止        y = y->parent;      }      if (node->right != y)  //若此时的右子节点不等于此时的父节点        node = y;  //此时的父节点即为解答,否则此时的 node 为解答    }  }  void decrement() //这个的逻辑更复杂。。。  {    if (node->color == __rb_tree_red &&  //如果是红节点,且父节点的父节点等于自己,右子节点即为解答 --> 什么情况父节点的父节点等于自己?        node->parent->parent == node)        node = node->right;    else if (node->left != 0) {      base_ptr y = node->left;      while (y->right != 0)        y = y->right;      node = y;    }    else {      base_ptr y = node->parent;      while (node == y->left) {        node = y;        y = y->parent;      }      node = y;    }  }};//RB-tree 的正规迭代器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; }  __rb_tree_iterator(const iterator& it) { node = it.node; }  reference operator*() const { return link_type(node)->value_field; }#ifndef __SGI_STL_NO_ARROW_OPERATOR  pointer operator->() const { return &(operator*()); }#endif /* __SGI_STL_NO_ARROW_OPERATOR */  self& operator++() { increment(); return *this; }  self operator++(int) {    self tmp = *this;    increment();    return tmp;  }      self& operator--() { decrement(); return *this; }  self operator--(int) {    self tmp = *this;    decrement();    return tmp;  }};inline bool operator==(const __rb_tree_base_iterator& x,                       const __rb_tree_base_iterator& y) {  return x.node == y.node;}inline bool operator!=(const __rb_tree_base_iterator& x,                       const __rb_tree_base_iterator& y) {  return x.node != y.node;}#ifndef __STL_CLASS_PARTIAL_SPECIALIZATIONinline bidirectional_iterator_tagiterator_category(const __rb_tree_base_iterator&) {  return bidirectional_iterator_tag();}inline __rb_tree_base_iterator::difference_type*distance_type(const __rb_tree_base_iterator&) {  return (__rb_tree_base_iterator::difference_type*) 0;}template <class Value, class Ref, class Ptr>inline Value* value_type(const __rb_tree_iterator<Value, Ref, Ptr>&) {  return (Value*) 0;}#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */inline void __rb_tree_rotate_left(__rb_tree_node_base* x, __rb_tree_node_base*& root){  __rb_tree_node_base* y = x->right;  x->right = y->left;  if (y->left !=0)    y->left->parent = x;  y->parent = x->parent;  if (x == root)    root = y;  else if (x == x->parent->left)    x->parent->left = y;  else    x->parent->right = y;  y->left = x;  x->parent = y;}inline void __rb_tree_rotate_right(__rb_tree_node_base* x, __rb_tree_node_base*& root){  __rb_tree_node_base* y = x->left;  x->left = y->right;  if (y->right != 0)    y->right->parent = x;  y->parent = x->parent;  if (x == root)    root = y;  else if (x == x->parent->right)    x->parent->right = y;  else    x->parent->left = y;  y->right = x;  x->parent = y;}//重新令树形平衡(改变颜色及旋转树形)//参数一为新增节点,参数二为 rootinline void __rb_tree_rebalance(__rb_tree_node_base* x, __rb_tree_node_base*& root){  x->color = __rb_tree_red; //新节点为红  //父节点为红的时候才要令树形平衡  while (x != root && x->parent->color == __rb_tree_red) {    //父节点是祖父节点的左子节点if (x->parent == x->parent->parent->left) {      __rb_tree_node_base* y = x->parent->parent->right;  //伯父节点存在,且为红 --> 变色即可      if (y && y->color == __rb_tree_red) {        x->parent->color = __rb_tree_black;        y->color = __rb_tree_black;        x->parent->parent->color = __rb_tree_red;        x = x->parent->parent;      }  //无伯父节点,或者伯父节点为黑 --> 旋转      else {        if (x == x->parent->right) {          x = x->parent;          __rb_tree_rotate_left(x, root);        }        x->parent->color = __rb_tree_black;        x->parent->parent->color = __rb_tree_red;        __rb_tree_rotate_right(x->parent->parent, root);      }    }//父节点是祖父节点的右子节点     else {      __rb_tree_node_base* y = x->parent->parent->left;      //伯父节点存在,且为红 --> 变色即可  if (y && y->color == __rb_tree_red) {        x->parent->color = __rb_tree_black;        y->color = __rb_tree_black;        x->parent->parent->color = __rb_tree_red;        x = x->parent->parent;      }  //无伯父节点,或者伯父节点为黑 --> 旋转      else {        if (x == x->parent->left) {          x = x->parent;          __rb_tree_rotate_right(x, root);        }        x->parent->color = __rb_tree_black;        x->parent->parent->color = __rb_tree_red;        __rb_tree_rotate_left(x->parent->parent, root);      }    }  }  root->color = __rb_tree_black; //根节点必须为黑色}inline __rb_tree_node_base*__rb_tree_rebalance_for_erase(__rb_tree_node_base* z,                              __rb_tree_node_base*& root,                              __rb_tree_node_base*& leftmost,                              __rb_tree_node_base*& rightmost){  __rb_tree_node_base* y = z;  __rb_tree_node_base* x = 0;  __rb_tree_node_base* x_parent = 0;  if (y->left == 0)             // z has at most one non-null child. y == z.    x = y->right;               // x might be null.  else    if (y->right == 0)          // z has exactly one non-null child.  y == z.      x = y->left;              // x is not null.    else {                      // z has two non-null children.  Set y to      y = y->right;             //   z's successor.  x might be null.      while (y->left != 0)        y = y->left;      x = y->right;    }  if (y != z) {                 // relink y in place of z.  y is z's successor    z->left->parent = y;     y->left = z->left;    if (y != z->right) {      x_parent = y->parent;      if (x) x->parent = y->parent;      y->parent->left = x;      // y must be a left child      y->right = z->right;      z->right->parent = y;    }    else      x_parent = y;      if (root == z)      root = y;    else if (z->parent->left == z)      z->parent->left = y;    else       z->parent->right = y;    y->parent = z->parent;    __STD::swap(y->color, z->color);    y = z;    // y now points to node to be actually deleted  }  else {                        // y == z    x_parent = y->parent;    if (x) x->parent = y->parent;       if (root == z)      root = x;    else       if (z->parent->left == z)        z->parent->left = x;      else        z->parent->right = x;    if (leftmost == z)       if (z->right == 0)        // z->left must be null also        leftmost = z->parent;    // makes leftmost == header if z == root      else        leftmost = __rb_tree_node_base::minimum(x);    if (rightmost == z)        if (z->left == 0)         // z->right must be null also        rightmost = z->parent;      // makes rightmost == header if z == root      else                      // x == z->left        rightmost = __rb_tree_node_base::maximum(x);  }  if (y->color != __rb_tree_red) {     while (x != root && (x == 0 || x->color == __rb_tree_black))      if (x == x_parent->left) {        __rb_tree_node_base* w = x_parent->right;        if (w->color == __rb_tree_red) {          w->color = __rb_tree_black;          x_parent->color = __rb_tree_red;          __rb_tree_rotate_left(x_parent, root);          w = x_parent->right;        }        if ((w->left == 0 || w->left->color == __rb_tree_black) &&            (w->right == 0 || w->right->color == __rb_tree_black)) {          w->color = __rb_tree_red;          x = x_parent;          x_parent = x_parent->parent;        } else {          if (w->right == 0 || w->right->color == __rb_tree_black) {            if (w->left) w->left->color = __rb_tree_black;            w->color = __rb_tree_red;            __rb_tree_rotate_right(w, root);            w = x_parent->right;          }          w->color = x_parent->color;          x_parent->color = __rb_tree_black;          if (w->right) w->right->color = __rb_tree_black;          __rb_tree_rotate_left(x_parent, root);          break;        }      } else {                  // same as above, with right <-> left.        __rb_tree_node_base* w = x_parent->left;        if (w->color == __rb_tree_red) {          w->color = __rb_tree_black;          x_parent->color = __rb_tree_red;          __rb_tree_rotate_right(x_parent, root);          w = x_parent->left;        }        if ((w->right == 0 || w->right->color == __rb_tree_black) &&            (w->left == 0 || w->left->color == __rb_tree_black)) {          w->color = __rb_tree_red;          x = x_parent;          x_parent = x_parent->parent;        } else {          if (w->left == 0 || w->left->color == __rb_tree_black) {            if (w->right) w->right->color = __rb_tree_black;            w->color = __rb_tree_red;            __rb_tree_rotate_left(w, root);            w = x_parent->left;          }          w->color = x_parent->color;          x_parent->color = __rb_tree_black;          if (w->left) w->left->color = __rb_tree_black;          __rb_tree_rotate_right(x_parent, root);          break;        }      }    if (x) x->color = __rb_tree_black;  }  return y;}template <class Key, class Value, class KeyOfValue, class Compare,          class Alloc = alloc>class rb_tree {protected:  typedef void* void_pointer;  typedef __rb_tree_node_base* base_ptr;  typedef __rb_tree_node<Value> rb_tree_node;  typedef simple_alloc<rb_tree_node, Alloc> rb_tree_node_allocator;  typedef __rb_tree_color_type color_type;public:  typedef Key key_type;  typedef Value value_type;  typedef value_type* pointer;  typedef const value_type* const_pointer;  typedef value_type& reference;  typedef const value_type& const_reference;  typedef rb_tree_node* link_type;  typedef size_t size_type;  typedef ptrdiff_t difference_type;protected:  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(); //配置空间    __STL_TRY {      construct(&tmp->value_field, x); //构造内容    }    __STL_UNWIND(put_node(tmp));    return tmp;  }  link_type clone_node(link_type x) { //复制一个节点    link_type tmp = create_node(x->value_field);    tmp->color = x->color;    tmp->left = 0;    tmp->right = 0;    return tmp;  }  void destroy_node(link_type p) {    destroy(&p->value_field); //析构内容    put_node(p); //释放内存  }protected:  size_type node_count; // 记录树的节点数量  link_type header;   //? header 是什么 ?-->   // 小技巧:为根节点设计的一个额外父节点  // header 的父节点指向根节点,左子节点指向最小节点,右子节点指向最大节点  Compare key_compare;  //节点间的键值大小比较准则,是个 function object  // header 的 parent, left, right 分别记录了 根节点、最左节点、最右节点 ??  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; }  // 取得 x 的成员,x 的类型是 link_type  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& parent(link_type x) { return (link_type&)(x->parent); }  static reference value(link_type x) { return x->value_field; }  static const Key& key(link_type x) { return KeyOfValue()(value(x)); } // ? KeyOfValue 是个 function object ? 在哪定义?  static color_type& color(link_type x) { return (color_type&)(x->color); }  // 取得 x 的成员,x 的类型是 base_ptr  static link_type& left(base_ptr x) { return (link_type&)(x->left); }  static link_type& right(base_ptr x) { return (link_type&)(x->right); }  static link_type& parent(base_ptr x) { return (link_type&)(x->parent); }  static reference value(base_ptr x) { return ((link_type)x)->value_field; }  static const Key& key(base_ptr x) { return KeyOfValue()(value(link_type(x)));}   static color_type& color(base_ptr x) { return (color_type&)(link_type(x)->color); }  //求取极大值和极小值。 node class 有实现此功能,交给它们完成  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:  typedef __rb_tree_iterator<value_type, reference, pointer> iterator;  typedef __rb_tree_iterator<value_type, const_reference, const_pointer>           const_iterator;#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION  typedef reverse_iterator<const_iterator> const_reverse_iterator;  typedef reverse_iterator<iterator> reverse_iterator;#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */  typedef reverse_bidirectional_iterator<iterator, value_type, reference,                                         difference_type>          reverse_iterator;   typedef reverse_bidirectional_iterator<const_iterator, value_type,                                         const_reference, difference_type>          const_reverse_iterator;#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ private:  iterator __insert(base_ptr x, base_ptr y, const value_type& v);  link_type __copy(link_type x, link_type p);  void __erase(link_type x);  void init() {    header = get_node(); //产生一个节点空间,令 header 指向它    color(header) = __rb_tree_red; // used to distinguish header from --> 不懂为什么要将 header 设置为红色                                   // root, in iterator.operator++    root() = 0; //令 header 的父节点为 NULL    leftmost() = header;    //令 header 的左子节点为自己    rightmost() = header;   //令 header 的右子节点为自己  }public:                                // allocation/deallocation  rb_tree(const Compare& comp = Compare())    : node_count(0), key_compare(comp) { init(); }  rb_tree(const rb_tree<Key, Value, KeyOfValue, Compare, Alloc>& x)     : node_count(0), key_compare(x.key_compare)  {     header = get_node();    color(header) = __rb_tree_red;    if (x.root() == 0) {      root() = 0;      leftmost() = header;      rightmost() = header;    }    else {      __STL_TRY {        root() = __copy(x.root(), header);      }      __STL_UNWIND(put_node(header));      leftmost() = minimum(root());      rightmost() = maximum(root());    }    node_count = x.node_count;  }  ~rb_tree() {    clear();    put_node(header);  }  rb_tree<Key, Value, KeyOfValue, Compare, Alloc>&   operator=(const rb_tree<Key, Value, KeyOfValue, Compare, Alloc>& x);public:                                    // accessors:  Compare key_comp() const { return key_compare; }  iterator begin() { return leftmost(); }              // RB 树的起头为最左节点处  const_iterator begin() const { return leftmost(); }  iterator end() { return header; }                    // RB 树的终点为 header 所指处 ??  const_iterator end() const { return header; }  reverse_iterator rbegin() { return reverse_iterator(end()); }  const_reverse_iterator rbegin() const {     return const_reverse_iterator(end());   }  reverse_iterator rend() { return reverse_iterator(begin()); }  const_reverse_iterator rend() const {     return const_reverse_iterator(begin());  }   bool empty() const { return node_count == 0; }  size_type size() const { return node_count; }  size_type max_size() const { return size_type(-1); }  void swap(rb_tree<Key, Value, KeyOfValue, Compare, Alloc>& t) {    __STD::swap(header, t.header);    __STD::swap(node_count, t.node_count);    __STD::swap(key_compare, t.key_compare);  }    public:                                // insert/erase  pair<iterator,bool> insert_unique(const value_type& x);  iterator insert_equal(const value_type& x);  iterator insert_unique(iterator position, const value_type& x);  iterator insert_equal(iterator position, const value_type& x);#ifdef __STL_MEMBER_TEMPLATES    template <class InputIterator>  void insert_unique(InputIterator first, InputIterator last);  template <class InputIterator>  void insert_equal(InputIterator first, InputIterator last);#else /* __STL_MEMBER_TEMPLATES */  void insert_unique(const_iterator first, const_iterator last);  void insert_unique(const value_type* first, const value_type* last);  void insert_equal(const_iterator first, const_iterator last);  void insert_equal(const value_type* first, const value_type* last);#endif /* __STL_MEMBER_TEMPLATES */  void erase(iterator position);  size_type erase(const key_type& x);  void erase(iterator first, iterator last);  void erase(const key_type* first, const key_type* last);  void clear() {    if (node_count != 0) {      __erase(root());      leftmost() = header;      root() = 0;      rightmost() = header;      node_count = 0;    }  }      public:                                // set operations:  iterator find(const key_type& x);  const_iterator find(const key_type& x) const;  size_type count(const key_type& x) const;  iterator lower_bound(const key_type& x);  const_iterator lower_bound(const key_type& x) const;  iterator upper_bound(const key_type& x);  const_iterator upper_bound(const key_type& x) const;  pair<iterator,iterator> equal_range(const key_type& x);  pair<const_iterator, const_iterator> equal_range(const key_type& x) const;public:                                // Debugging.  bool __rb_verify() const;};template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>inline bool operator==(const rb_tree<Key, Value, KeyOfValue, Compare, Alloc>& x,                        const rb_tree<Key, Value, KeyOfValue, Compare, Alloc>& y) {  return x.size() == y.size() && equal(x.begin(), x.end(), y.begin());}template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>inline bool operator<(const rb_tree<Key, Value, KeyOfValue, Compare, Alloc>& x,                       const rb_tree<Key, Value, KeyOfValue, Compare, Alloc>& y) {  return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end());}#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDERtemplate <class Key, class Value, class KeyOfValue, class Compare, class Alloc>inline void swap(rb_tree<Key, Value, KeyOfValue, Compare, Alloc>& x,                  rb_tree<Key, Value, KeyOfValue, Compare, Alloc>& y) {  x.swap(y);}#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>rb_tree<Key, Value, KeyOfValue, Compare, Alloc>& rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::operator=(const rb_tree<Key, Value, KeyOfValue, Compare, Alloc>& x) {  if (this != &x) {                                // Note that Key may be a constant type.    clear();    node_count = 0;    key_compare = x.key_compare;            if (x.root() == 0) {      root() = 0;      leftmost() = header;      rightmost() = header;    }    else {      root() = __copy(x.root(), header);      leftmost() = minimum(root());      rightmost() = maximum(root());      node_count = x.node_count;    }  }  return *this;}template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>typename rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::iteratorrb_tree<Key, Value, KeyOfValue, Compare, Alloc>::__insert(base_ptr x_, base_ptr y_, const Value& v) {  // x 为新值插入点, y 为插入点之父节点,v 为新值  link_type x = (link_type) x_;  link_type y = (link_type) y_;  link_type z;  // 遇"大",往左插入新值  if (y == header || x != 0 || key_compare(KeyOfValue()(v), key(y))) { // x 不是一定等于 0 吗?      z = create_node(v);    left(y) = z;                    if (y == header) {           //这使得当 y 为 header 时(即此时树为空), leftmost() = z      root() = z;      rightmost() = z;    }    else if (y == leftmost())   //当 y 为最左节点时,更新 leftmost() ,使它永远指向最左节点      leftmost() = z;             }  // 遇"小",往右插入新值  else {    z = create_node(v);    right(y) = z;    if (y == rightmost())      //当 y 为最右节点时,更新 rightmost() ,使它永远指向最右节点      rightmost() = z;            }  // 新增的 z 节点的父、左、右节点  parent(z) = y;  left(z) = 0;  right(z) = 0;  //调整 RB-tree (旋转并改变颜色)   __rb_tree_rebalance(z, header->parent);  ++node_count; //节点累计加1  return iterator(z); //返回指向新节点的迭代器}// 将 x 插入到 RB-tree 中(保持节点值独一无二)template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>typename rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::iteratorrb_tree<Key, Value, KeyOfValue, Compare, Alloc>::insert_equal(const Value& v){  link_type y = header; // y 记录父节点  link_type x = root();   while (x != 0) {      //从根节点开始,往下寻找适当的插入点    y = x; //遇"大"往左,遇"小于或等于"则往右    x = key_compare(KeyOfValue()(v), key(x)) ? left(x) : right(x); //KeyOfValue 是一个重载了 operator() 的类,语句 KeyOfValue() 产生了该类的一个对象,该对象可像函数一样被调用,称为函数对象  }  return __insert(x, y, v); // x 为新值插入点, y 为插入点之父节点, v 为新值}// 将 x 插入到 RB-tree 中(允许节点值重复)// 返回一个 pair ,第一元素是个 RB-tree 迭代器,指向新增节点;第二元素表示插入成功与否template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>pair<typename rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::iterator, bool>rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::insert_unique(const Value& v){  link_type y = header;  link_type x = root();  //从根节点开始  bool comp = true;  while (x != 0) { //从根节点开始,往下寻找适当的插入点    y = x;//记录父节点    comp = key_compare(KeyOfValue()(v), key(x));     x = comp ? left(x) : right(x); //遇"大"则往左,遇"小于或等于"则往右  }  iterator j = iterator(y);     if (comp)   //遇"大",将插入于左侧    if (j == begin())           return pair<iterator,bool>(__insert(x, y, v), true);    else      --j;  if (key_compare(key(j.node), KeyOfValue()(v))) //遇"小",将插入于右侧    return pair<iterator,bool>(__insert(x, y, v), true);  return pair<iterator,bool>(j, false); // 相等的,不插入}template <class Key, class Val, class KeyOfValue, class Compare, class Alloc>typename rb_tree<Key, Val, KeyOfValue, Compare, Alloc>::iterator rb_tree<Key, Val, KeyOfValue, Compare, Alloc>::insert_unique(iterator position,                                                             const Val& v) {  if (position.node == header->left) // begin()    if (size() > 0 && key_compare(KeyOfValue()(v), key(position.node)))      return __insert(position.node, position.node, v);  // first argument just needs to be non-null     else      return insert_unique(v).first;  else if (position.node == header) // end()    if (key_compare(key(rightmost()), KeyOfValue()(v)))      return __insert(0, rightmost(), v);    else      return insert_unique(v).first;  else {    iterator before = position;    --before;    if (key_compare(key(before.node), KeyOfValue()(v))        && key_compare(KeyOfValue()(v), key(position.node)))      if (right(before.node) == 0)        return __insert(0, before.node, v);       else        return __insert(position.node, position.node, v);    // first argument just needs to be non-null     else      return insert_unique(v).first;  }}template <class Key, class Val, class KeyOfValue, class Compare, class Alloc>typename rb_tree<Key, Val, KeyOfValue, Compare, Alloc>::iterator rb_tree<Key, Val, KeyOfValue, Compare, Alloc>::insert_equal(iterator position,                                                            const Val& v) {  if (position.node == header->left) // begin()    if (size() > 0 && key_compare(KeyOfValue()(v), key(position.node)))      return __insert(position.node, position.node, v);  // first argument just needs to be non-null     else      return insert_equal(v);  else if (position.node == header) // end()    if (!key_compare(KeyOfValue()(v), key(rightmost())))      return __insert(0, rightmost(), v);    else      return insert_equal(v);  else {    iterator before = position;    --before;    if (!key_compare(KeyOfValue()(v), key(before.node))        && !key_compare(key(position.node), KeyOfValue()(v)))      if (right(before.node) == 0)        return __insert(0, before.node, v);       else        return __insert(position.node, position.node, v);    // first argument just needs to be non-null     else      return insert_equal(v);  }}#ifdef __STL_MEMBER_TEMPLATES  template <class K, class V, class KoV, class Cmp, class Al> template<class II>void rb_tree<K, V, KoV, Cmp, Al>::insert_equal(II first, II last) {  for ( ; first != last; ++first)    insert_equal(*first);}template <class K, class V, class KoV, class Cmp, class Al> template<class II>void rb_tree<K, V, KoV, Cmp, Al>::insert_unique(II first, II last) {  for ( ; first != last; ++first)    insert_unique(*first);}#else /* __STL_MEMBER_TEMPLATES */template <class K, class V, class KoV, class Cmp, class Al>voidrb_tree<K, V, KoV, Cmp, Al>::insert_equal(const V* first, const V* last) {  for ( ; first != last; ++first)    insert_equal(*first);}template <class K, class V, class KoV, class Cmp, class Al>voidrb_tree<K, V, KoV, Cmp, Al>::insert_equal(const_iterator first,                                          const_iterator last) {  for ( ; first != last; ++first)    insert_equal(*first);}template <class K, class V, class KoV, class Cmp, class A>void rb_tree<K, V, KoV, Cmp, A>::insert_unique(const V* first, const V* last) {  for ( ; first != last; ++first)    insert_unique(*first);}template <class K, class V, class KoV, class Cmp, class A>void rb_tree<K, V, KoV, Cmp, A>::insert_unique(const_iterator first,                                          const_iterator last) {  for ( ; first != last; ++first)    insert_unique(*first);}#endif /* __STL_MEMBER_TEMPLATES */         template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>inline voidrb_tree<Key, Value, KeyOfValue, Compare, Alloc>::erase(iterator position) {  link_type y = (link_type) __rb_tree_rebalance_for_erase(position.node,                                                          header->parent,                                                          header->left,                                                          header->right);  destroy_node(y);  --node_count;}template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>typename rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::size_type rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::erase(const Key& x) {  pair<iterator,iterator> p = equal_range(x);  size_type n = 0;  distance(p.first, p.second, n);  erase(p.first, p.second);  return n;}template <class K, class V, class KeyOfValue, class Compare, class Alloc>typename rb_tree<K, V, KeyOfValue, Compare, Alloc>::link_type rb_tree<K, V, KeyOfValue, Compare, Alloc>::__copy(link_type x, link_type p) {                                // structural copy.  x and p must be non-null.  link_type top = clone_node(x);  top->parent = p;   __STL_TRY {    if (x->right)      top->right = __copy(right(x), top);    p = top;    x = left(x);    while (x != 0) {      link_type y = clone_node(x);      p->left = y;      y->parent = p;      if (x->right)        y->right = __copy(right(x), y);      p = y;      x = left(x);    }  }  __STL_UNWIND(__erase(top));  return top;}template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>void rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::__erase(link_type x) {                                // erase without rebalancing  while (x != 0) {    __erase(right(x));    link_type y = left(x);    destroy_node(x);    x = y;  }}template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>void rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::erase(iterator first,                                                             iterator last) {  if (first == begin() && last == end())    clear();  else    while (first != last) erase(first++);}template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>void rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::erase(const Key* first,                                                             const Key* last) {  while (first != last) erase(*first++);}template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>typename rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::iterator rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::find(const Key& k) {  link_type y = header;        // Last node which is not less than k.   link_type x = root();        // Current node.   while (x != 0) //如果当前键值大于搜索键值,往左走    if (!key_compare(key(x), k))      y = x, x = left(x);//如果当前键值小于等于搜索键值,往右走    else      x = right(x);  iterator j = iterator(y);     return (j == end() || key_compare(k, key(j.node))) ? end() : j;}template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>typename rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::const_iterator rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::find(const Key& k) const {  link_type y = header; /* Last node which is not less than k. */  link_type x = root(); /* Current node. */  while (x != 0) {    if (!key_compare(key(x), k))      y = x, x = left(x);    else      x = right(x);  }  const_iterator j = const_iterator(y);     return (j == end() || key_compare(k, key(j.node))) ? end() : j;}template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>typename rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::size_type rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::count(const Key& k) const {  pair<const_iterator, const_iterator> p = equal_range(k);  size_type n = 0;  distance(p.first, p.second, n);  return n;}template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>typename rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::iterator rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::lower_bound(const Key& k) {  link_type y = header; /* Last node which is not less than k. */  link_type x = root(); /* Current node. */  while (x != 0)     if (!key_compare(key(x), k))      y = x, x = left(x);    else      x = right(x);  return iterator(y);}template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>typename rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::const_iterator rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::lower_bound(const Key& k) const {  link_type y = header; /* Last node which is not less than k. */  link_type x = root(); /* Current node. */  while (x != 0)     if (!key_compare(key(x), k))      y = x, x = left(x);    else      x = right(x);  return const_iterator(y);}template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>typename rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::iterator rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::upper_bound(const Key& k) {  link_type y = header; /* Last node which is greater than k. */  link_type x = root(); /* Current node. */   while (x != 0)      if (key_compare(k, key(x)))       y = x, x = left(x);     else       x = right(x);   return iterator(y);}template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>typename rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::const_iterator rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::upper_bound(const Key& k) const {  link_type y = header; /* Last node which is greater than k. */  link_type x = root(); /* Current node. */   while (x != 0)      if (key_compare(k, key(x)))       y = x, x = left(x);     else       x = right(x);   return const_iterator(y);}template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>inline pair<typename rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::iterator,            typename rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::iterator>rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::equal_range(const Key& k) {  return pair<iterator, iterator>(lower_bound(k), upper_bound(k));}template <class Key, class Value, class KoV, class Compare, class Alloc>inline pair<typename rb_tree<Key, Value, KoV, Compare, Alloc>::const_iterator,            typename rb_tree<Key, Value, KoV, Compare, Alloc>::const_iterator>rb_tree<Key, Value, KoV, Compare, Alloc>::equal_range(const Key& k) const {  return pair<const_iterator,const_iterator>(lower_bound(k), upper_bound(k));}inline int __black_count(__rb_tree_node_base* node, __rb_tree_node_base* root){  if (node == 0)    return 0;  else {    int bc = node->color == __rb_tree_black ? 1 : 0;    if (node == root)      return bc;    else      return bc + __black_count(node->parent, root);  }}template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>bool rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::__rb_verify() const{  if (node_count == 0 || begin() == end())    return node_count == 0 && begin() == end() &&      header->left == header && header->right == header;    int len = __black_count(leftmost(), root());  for (const_iterator it = begin(); it != end(); ++it) {    link_type x = (link_type) it.node;    link_type L = left(x);    link_type R = right(x);    if (x->color == __rb_tree_red)      if ((L && L->color == __rb_tree_red) ||          (R && R->color == __rb_tree_red))        return false;    if (L && key_compare(key(x), key(L)))      return false;    if (R && key_compare(key(R), key(x)))      return false;    if (!L && !R && __black_count(x, root()) != len)      return false;  }  if (leftmost() != __rb_tree_node_base::minimum(root()))    return false;  if (rightmost() != __rb_tree_node_base::maximum(root()))    return false;  return true;}__STL_END_NAMESPACE #endif /* __SGI_STL_INTERNAL_TREE_H */// Local Variables:// mode:C++// End:


0 0
原创粉丝点击