map与set底层都是调用的RBTreenode
首先看RBTree数据结构
红黑树的特性:函数
1.根节点为黑色设计
2.新增节点必定是红色指针
3.节点只有红色或黑色两种颜色排序
4.两个节点颜色不能同为红变量
5.任意一条路径上的黑色节点个数相同二叉树
红黑树的节点设计:map
1.表示节点颜色的变量color迭代器
2.连接左子树的left指针
3.连接右子树的right指针
4.连接父节点的parent指针
5.表示节点值的变量value_field;在map中为pair对,在set中只有key
RBTree的迭代器:
1.属于双向迭代器
2.RBTree是有排序的,迭代器的++与--其实是在二叉树上找下一个节点的过程
RBTree的数据结构:
1.一个指向头结点的指针header:
头结点:
在RBTree中维护一个头结点,这个头结点的父节点其实是树的根节点,而树的根节点的父节点是这个头结点。
而头结点的左指针left指向整个树的最左节点,也就是最小值
头结点的右指针right指向整个树的最右节点,也就是最大值
2.node_count记录树的大小
3.一个用于比较元素大小的仿函数
insert_equal()与insert_unique:
insert_equal容许RBTree中存在相同的节点,进行插入时,小于当前节点则向左走;等于或等于则向右走;若是有相同的元素,则插在相同元素的右侧,好比9的右子节点有一个10,则在插入10就插入在这个10的右子节点
inert_unique不容许RBTree中存在相同的节点,在找到插入位置后,若是插入位置的父亲节点的值与待插入节点(插入必定插在一个空子树的位置)相同,则不插入.
set的节点只拥有一个key值,所以是不能够修改的,不然会破坏RBTree的结构。
Set的特性与list一致,当插入或删除某个迭代器时,除了这个迭代器,其余的迭代器都不会失效.
Set以红黑树为底层,数据结构中存在一个红黑树变量t.
map的节点是一个pair对,拥有key-value的特性,排序时根据key进行排序
与set同样,对迭代器的插入或删除不会影响其余迭代器
set与multiset;map与mutimap的用法都一致,只是multiset和multimap使用的是insert_equal.