【C++】STL系列(7):底层容器rb_tree(红黑树)和其支撑的set与map

–本文章来自于侯捷老师的STL课程和自己的理解

若有错误,欢迎指正

在这里插入图片描述
首先,红黑树是一种高度平衡的二分查找树,排列规则有利于search和insert并保持平衡。(红黑树之后会单独开专栏说)

红黑树提供“遍历”操作及iterator,排序状态是从左子树->右子树

我们不应该使用rb_tree的iterator去改变元素值,因为会破坏结构,但是变成层面没有禁止这件事情。因为map容器允许data被改变,而key才是不能被改变。

rb_tree提供两种insertion操作:insert_unique()和insert_equal()
前者需要安插的key独一无二,否则安插失败,而后者则不用。

在这里插入图片描述
红黑树内部用三个数据来表达自己:
Size_type node_count(红黑树的节点数量)
link_type header(指向红黑树的指针)
Compare key_compare(key大小的比较准则,一般是一个函数)

注:rb_tree是一个非公开的容器,是支撑map和set的底层容器。当然,如果想要直接使用的话也是可以的,如下
在这里插入图片描述
此外,header是指向虚节点的,与list一样,也是为了方便操作

那么首先介绍支撑的set和multiset:
在这里插入图片描述
set需要三个模板参数< class key,class compare = less< key>,class Alloc = alloc>
key就是key值对
compare是比较函数,默认值为less< key>
分配器默认为alloc
在这里插入图片描述

然后是map和mutimap
在这里插入图片描述
与set大致相同,需要注意的是模板里面的value是由key和data合成的。
在这里插入图片描述
同时还需要注意,map是可以使用【】来访问元素的。不过要访问data还是尽量使用at()函数。
在这里插入图片描述
最后多提一句,对这两个容器的元素进行查找的时候,尽量使用他们自带的查找函数find,而不要使用全局的那个find()。
即使用map.find()而不是::find()

容器map的使用方法
容器set的使用方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值