c++ STL- rb_tree的结构概览

2.0 正文

2.1 结构

看set的时候发现其是基于rb_tree实现的,rb_tree主要实现在文件stl_tree.h中,其结构如下所示:

_M_t: 类型为rb_tree, std::set中放的红黑树
_M_impl: 类型为_Rb_tree_impl,红黑树的具体实现,存放着头节点_M_header和树节点个数_M_node_count
_M_header: 类型为 _Rb_tree_node_base, 树的首节点并非是根节点,在实现上做了巧妙的设计,用其本身作为end(),_M_left存储树的最左端节点也就是begin(),_M_right存储了树的最右端节点也就是rbegin(), parent的含义暂不明确存储的值和_M_left一样,估计是什么巧妙的实现
_Rb_tree_node<_Val>: 真正的树节点类型,对_Rb_tree_node_base做了继承,并保存了数据类型_Val,存储了数据_M_value_field,
_M_value_field: 节点中存储的数据;

这里压缩的设计就是: 把node节点类型拆分成了_Rb_tree_node_base_Rb_tree_node<_Val>,前者只用来节点的parent, left, right而后者保存了实际的数据和数据类型,使得创建树时树的首节点_M_header因没有数据,只使用_Rb_tree_node_base即可,不必占用多一个空间;
而为此付出的复杂度是iterator中存的数据节点是基类类型_Rb_tree_node_base*,真正取数据的时候需要对其做一次 _Rb_tree_node_base* -> _Rb_tree_node* 的类型转换

posted @ 2022-04-15 23:07  woder  阅读(296)  评论(0编辑  收藏  举报