红黑树是平衡二分搜索树。
其元素排列规则有利于查找和插入。
红黑树提供遍历操作及iterator,按照it++遍历能得到排序的状态。
不应该使用iterator改变元素值,会打乱其排列规则。
红黑树是set和map的底部支持。
STL红黑树类(非公开容器)
Key是键的类型,Value是值(key和data的结合)的类型 ,
KeyOfValue是如何将key从value中取出(函数对象),
Compare是key的比较方法(函数对象),
Alloc分配器
内部数据
node_count是结点个数
header是一个指向头节点的指针
key_compare是比较大小的准则(一般是函数对象)
其插入元素有两种操作:
insert_unique() 插入的结点key值在树中必须独一无二,key不能重复。
insert_equal() 插入的结点key值可以重复。
set/multiset
set是以红黑树类为底层实现的容器,因此具有元素自动排序的特性。其结点上key与value合二为一。
set提供遍历操作及iterator。利用迭代器it++遍历可以得到有序的排列。无法使用iterator改变元素的值。set的iterator其底部是rb_tree的const_iterator
,防止被user改变元素值。
set元素key不能重复,因此其insert()是调用底层rb_tree类的insert_unique()
multiset元素key可以重复,因此其insert()是调用的底层rb_tree类的insert_equal()
GNU2.9 set的stl源码:
内部关系:
内部唯一的数据 rep_type t 就是一棵红黑树。
对set的所有操作都是对底层的红黑树t的操作,所有set也可以理解为一个container adapter
。
map/multimap
map是以红黑树类为底层实现的容器,因此具有元素自动排序的特性。每个结点元素包含一个key和一个data,二者合称value。
map提供遍历操作及iterator。利用迭代器it++遍历可以得到有序的排列。无法使用iterator改变元素的key值,可以改变其data值。它自动将user指定的key type转化为const防止被修改。
map元素key不能重复,因此其insert()是调用底层rb_tree类的insert_unique()
multimap元素key可以重复,因此其insert()是调用的底层rb_tree类的insert_equal()