–本文章来自于侯捷老师的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()