STL::rb_tree红黑树以及set,map

红黑树是平衡二分搜索树。

其元素排列规则有利于查找和插入。
红黑树提供遍历操作及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()
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值