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*
的类型转换
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 提示词工程——AI应用必不可少的技术
· 地球OL攻略 —— 某应届生求职总结
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界