下面就要开始介绍关联容器了,set,multiset,map,multimap底层都是由红黑树实现的,而unordered版本的这四种容器都是由hashtable实现的。本部分包括关联容器这个大主题的第一部分内容:红黑树。注意:这里的介绍不包括红黑树的着色、旋转等原理,介绍的主题是结合G2.9的源代码,看红黑树的成员、接口等实现方式。
一、红黑树的G2.9实现
红黑树是一种自平衡二叉搜索树,之前学习过AVL树,但为什么红黑树在实际工程中应用这么广泛后面还是要了解一下。红黑树有几个需要遵守的规则:比如节点有红黑两种颜色,根节点必须是黑节点,红节点不能相邻,从任意节点到叶节点的所有路径上的黑节点数目是固定的。当插入一个新节点时,上述规则会被违反,所以需要对树做一些调整,调整大概分两种:重新涂色和旋转,旋转和AVL树一样分四种情况,所以我猜两种树的旋转规则是一样的,调整细节有空再看把,估计也不需要知道那么细,下面看G2.9源码:
template <class Key,
class Value,
class KeyOfValue,
class Compare,
class Alloc = alloc>
class rb_tree{
protected:
typedef __rb_tree_node<Value> rb_tree_node;
......
public:
typedef rb_tree_node* link_type;
......
protected:
size_type node_count; //rb_tree的大小
link_ty