stl源码剖析 详细学习笔记 RB_tree (2)

AI Agent 跨会话失忆怎么办?用外部状态文件实现持久化任务规划 AI Agent 在处理大型编程任务时,常因上下文窗口限制而陷入“上下文漂移”,导致跨会话遗忘关键决策与进度。单纯依赖更长上下文或反复提示并不可靠,核心解法在于将任务规划与进度外置到文件系统,形成持久化“第二大脑”。这种外部记忆机制通过加载、执行、更新三步闭环,让 Coding Agent 精确恢复项目状态,避免重复劳动。无论是 Claude Code 还是其他命令行工具,均可借助 skill 体系落地。实践表明,维护一份包含目标、任务清单、阻塞项与下一步动作的 plan.md,即可显著提升多阶段、多文件项 阅读详情

//---------------------------15/03/22----------------------------

    

    //一直好奇KeyOfValue是什么,查了下就是一个和仿函数差不多的东西,在第7章会详细介绍

    //现在只知道KeyOfValue()可以构造一个类调用他的operator()可以得到一个value的key

    

    //允许重复的插入

   template<class Key,class Value, class KeyOfValue,class Compare, class Alloc>

   typename rb_tree<key, Value, KeyOfValue, Compare, Alloc>::iterator

    rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::insert_equal(const Value& v)

    {

        link_type y = header;

        link_type x = root();

        //从根节点开始搜索直到x为叶子节点

       while ( x != 0)

        {

            y = x;

            x = key_compare(KeyOfValue()(v),key(x)) ? left(x) : right(x);

        }

        

        //把一个值为v的节点插入x的位置,y是x的父节点

       return __insert(x,y,v);

    }

    

    //不允许重复

    //可以插入(没有重复)返回的bool为true,否则为false

   template<class Key,class Value, class KeyOfValue,class Compare, class Alloc>

    pair<typename rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::iterator,bool>

    rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::insert_unique(const Value& v)

    {

        link_type y = header;

        link_type x =root();

       bool comp = true;

       while( x != 0)

        {

            y = x;

            comp = key_compare(KeyOfValue()(v),key(x));

            x = comp ? left(x) :right(x);

        }

        

        iterator j = iterator(y);

        

        //最后如果v "小于"(假设比较操作是小于) y

        //这边做这样的操作是因为"大于等于"的时候都会向右走,所以需要换一下j.node和v的位置

        //看看是否不相等

       if(comp)

           if(j == begin())    //如果插入点的父节点是最左边的节点

               return pair<iterator,bool>(__insert(x,y,v),true);

           else            //不是最左边就要--j继续判断

                --j;

        //这是因为只有最左边可以确定没有比v小的元素了

        

        //如果j.node确实小于v就可以插入。

       if(key_compare(key(j.node),KeyOfValue()(v)))

           return pair<iterator,bool>(__insert(x,y,v),true);

       return pair<iterator,bool>(j,false);

        

       /*

            总结下:会出现想等的情况只有有向右走的情况

            如果最后是向右走的,那么有可能相等的元素就是j也就是y也就是要插入位置 的父节点

            如果最后是向左走的,那么有可能相等的就是比j小的最大的那个元素,也就是--j

         

        */

    }

    

    

    //__insert

    

   template<class Key,class Value, class KeyOfValue,class Compare, class Alloc>

   typename    rb_tree<key, Value, KeyOfValue, Compare, Alloc>::iterator

    rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::

        __insert(base_ptr x_, base_ptr y_,const Value& v)

    {

        

        

        link_type x = (link_type) x_;

        link_type y = (link_type) y_;

        link_type z;

        

        //如果要插入的是根节点或者 要插入的位置不是空(header的左右儿子) 或v小于y 那么就是要插入到左边

       if(y == header || x != 0 || key_compare(KeyOfValue()(v),key(y)))

        {

            z = create_node(v);

            left(y) = z;   //如果y是header那可以设置leftmost为z

            //如果要插入的是根节点,

           if(y == header)

            {

               //设置根节点

                root() = z;

               //设置最右边的元素

                rightmost() = z;

            }

           //如果要插到最左边

           else if(y == leftmost())

                leftmost() = z;

            

        }

       else

        {

            z = create_node(v);

            right(y) = z;

           if (y == rightmost())

                rightmost() = z;

        }

        

        //父节点为y左右儿子都是 空。

        parent(z) = y;

        left(z) =0;

        right(z) =0;

        

       //调整平衡

        __rb_tree_rebalance(z,header->parent);

        ++node_count;

       return iterator(z);

    }

    

    

    //旋转以及变色

    

    

    //平衡这里inline是什么意思?里面明明有循环 而且代码这么长

    //下面的代码几乎和算法导论里的一样

    inline void

    __rb_tree_rebalance(__rb_tree_node_base* x, __rb_tree_node_base*& root)

    {

        x->color = __rb_tree_red;

       while(x != root && x->parent->color == __rb_tree_red)

        {

           if(x->parent == x->parent->parent->left)

            {

                __rb_tree_node_base* y =x->parent->parent->right;

               if(y && y->color == __rb_tree_red)

                {

                    x->parent->color = __rb_tree_black;

                    y->color = __rb_tree_black;

                    x->parent->parent->color = __rb_tree_red;

                    x = x->parent->parent;

                }

               else

                {

                   if(x == x->parent->right)

                    {

                        x = x->parent;

                        __rb_tree_rotate_left(x, root);

                    }

                    x->parent->color = __rb_tree_black;

                    x->parent->parent->color = __rb_tree_red;

                    __rb_tree_rotate_right(x->parent->parent, root);

                }

            }

           else

            {

                __rb_tree_node_base* y =x->parent->parent->left;

               if(y && y->color == __rb_tree_red)

                {

                    x->parent->color = __rb_tree_black;

                    y->color = __rb_tree_black;

                    x->parent->parent->color = __rb_tree_red;

                    x = x->parent->parent;

                }

               else

                {

                   if(x == x->parent->left)

                    {

                        x = x->parent;

                        __rb_tree_rotate_right(x,root);

                    }

                    x->parent->color = __rb_tree_black;

                    x->parent->parent->color = __rb_tree_red;

                    __rb_tree_rotate_left(x->parent->parent,root);

                }

            }

        }

        root->color = __rb_tree_black;

    }

    

   //左转

    

   inline voide

    __rb_tree_rotate_left(__rb_tree_node_base* x,__rb_tree_node_base*& root)

    {

        __rb_tree_node_base* y = x->right;

        x->right = y->left;

       if(y->left != 0)

            y->left->parent = x;

        y->parent = x->parent;

        

       if(x == root)

            root = y;

       else if (x == x->parent->left)

            x->parent->left = y;

       else

            x->parent->right = y;

        y->left = x;

        y->parent = y;


    }

    

   //右转

   inline voide

    __rb_tree_rotate_right(__rb_tree_node_base* x,__rb_tree_node_base*& root)

    {

        __rb_tree_node_base* y = x->left;

        x->left = y->right;

       if(y->right != 0)

            y->right->parent = x;

        y->parent = x->parent;

        

       if(x == root)

            root = y;

       else if (x == x->parent->right)

            x->parent->right = y;

       else

            x->parent->left = y;

        y->right= x;

        y->parent = y;

        

    }

    

    //find

   template<class Key,class Value, class KeyOfValue,class Compare, class Alloc>

   typename    rb_tree<key, Value, KeyOfValue, Compare, Alloc>::iterator

    rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::find(const Key& k)

    {

        link_type y =header;

        link_type x =root();

        

       while(x != 0)

           if(!key_compare(key(x), k))

                y = x, x =left(x);

       else

            x = right(x);

        

        iterator j =iterator(y);

       return (j ==end() || key_compare(k, key(j.node))) ? end() :j;

    }



    //最后没有delete操作,之前的算法导论部分已经给出了delete操作


STL源码剖析——RB-Tree(红黑树) 前言 有关红黑树的zh 阅读详情

相关推荐

《STL源码剖析》之RB-tree

AVL树之外,另一个被广泛运用的平衡二叉搜索树是RB-tree。所谓红黑树,不仅是一个二叉搜索树,它还满足以下性质: 性质1. 每个节点是红色或黑色; 性质2. 根是黑色; 性质3. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点) 性质4. 从任一节点到NULL(树尾端)的任何路径都包含相同数目的黑色节点。

iFuMI的博客 893

STL RB Tree(红黑树)分析

红黑树的概念和条件,以及SGI STL中对RB Tree迭代器和数据结构以及一些重要函数的实现进行简要的说明。

UPing In The Road 2304

STL源码剖析(十三)关联式容器之rb_tree

STL源码剖析(十三)关联式容器之rb_tree 文章目录STL源码剖析(十三)关联式容器之rb_tree一、rb_tree的数据结构二、rb_tree的迭代器三、rb_tree的操作3.1 构造函数3.2 析构函数3.3 插入元素3.4 删除元素3.5 其他操作 rt_tree是红黑树,在STL中,它并没有对使用者开放,但它非常重要,它作为set和map的底部支持 这篇文章不详细讨论红黑树的算法...

JT同学的博客 737

关联容器模板型别

template <class Key, class Value, class KeyOfValue, class Compare, class Alloc = alloc> class rb_tree {} 型别说明:Key 键值类型 Value 元素型别 KeyOfValue 仿函数,由元素型别得出键值型别 Comapre 仿函数,比较键值

u011402017的博客 343

Unity手游优化实战:用GPU Instancing把草地渲染的DrawCall从8000降到20(附完整Shader)

本文详细介绍了Unity手游中利用GPU Instancing技术优化草地渲染的实战方法,将DrawCall从8000降至20。通过Shader改造和性能优化技巧,开发者可以在移动端实现高效渲染,显著提升游戏性能。文章包含完整的Shader代码和优化策略,适合Unity开发者学习应用。

weixin_33691817的博客 489

第10章:位同步与Gardner环路(1)

第10章(1)内容如下:一、位同步与载波同步的区别1、采样时钟相位偏差的影响2、采样时钟频率偏差的影响二、Gardner环路算法与插值方法1、插值滤波器2、Gardner误差检查算法三、Gardner环路中环路滤波器与数字振荡器设计1、环路滤波器2、数控振荡器(NCO)四、Gardner环路的可运行MATLAB代码五、参考资料六、致谢 最近搞懂了Gardner环路的一些知识,于是更新第10章——位同步。 如果你稍不留意的话,这可能是你在网上能看到的介绍Gardner环路及其MATLAB仿真最详细的一篇文章了

weixin_44283855的博客 1万+

STL之关联容器的映射底层

STL的关联容器有set, map, multiset, multimap.用于实现它们的底层容器有划入标准的rb_tree和待加入标准的hashtable. 底层容器rb_tree为上层容器提供了一种有序的服务.关键步骤时间复杂度为O(lgN); 底层容器hashtable为上层容器提供的是无序的服务,但其关键步骤的时间复杂度为O(1). 那么上层容器是怎么映射到底层容器中

奋斗的小鸟 1084

硬件-电源-智能保护:eFuse选型与实战设计全攻略

本文深入解析eFuse在硬件电源设计中的关键作用与实战选型技巧。作为智能保护器件,eFuse能提供毫安级精度的过流保护、多重故障防护和智能恢复功能,比传统保险丝快1000倍以上。文章详细介绍了eFuse的工作原理、五大选型维度和PCB布局要点,帮助工程师有效预防电源异常导致的硬件损坏,适用于AI服务器、工业控制等场景。

weixin_30879169的博客 200

C++ STL :红黑树rb_tree源码剖析

STL关联式容器map、set、multimap、multiset,绝大部分操作如插入、修改、删除、搜索,都是由其内含的红黑树来完成的。我下面会总结 STL中rb_tree怎么实现的。首先,rb_tree是红黑树,所以需要定义红色和黑色。然后需要定义 红黑树的节点。_Rb_tree_node_base定义了红黑树的节点类,从类中可以看出一个节点有颜色、父指针、左孩子指针、右孩子指针4个属性。然后定义了几个函数,可以找到以这个节点为根节点的红黑树的最大节点和最小节点。

_ 1648

linux内核学习(八)---摄像头框架移植(上)

本章来开始进行摄像头的移植,同时回顾一下V4L2的整个框架

文艺小少年的博客 113

Google Gemini 模型本地可视化

Google近期发布了Gemini模型,而且开放了Gemini Pro API,Gemini Pro 可免费使用!Gemini Pro支持全球180个国家的38种语言,目前接受文本、图片作为输入并生成文本作为输出。Gemini Pro的表现超越了其他同类模型,当前版本配备了 32K 文本上下文窗口,可免费使用,且其定价将十分有竞争力。Gemini Pro具备丰富的功能:函数调用、数据嵌入、语义检索、自定义知识嵌入以及聊天功能。

HJ_blog 1247

STL源码剖析笔记——AVL-tree、RB-tree、set、map、mutiset、mutimap

STL源码剖析笔记——AVL-tree、RB-tree、set、map、mutiset、mutimap

weixin_48956191的博客 1136

fast-lio系列改进版本

2.回环检测的优化结果,更新到FAST-LIO2的当前帧位姿中,幷进行ikdtree的重构,进而更新submap。其它的效果还不清楚,实测lio部分稳定性很好。用fast-lio_slam就很稳定。融合了fast-lio2和sc-pgo,两部分分开运行,SC-PGO从FAST-LIO2节点获取里程计和激光雷达点云主题。的作者kim在FAST-LIO2的基础上,添加SC-PGO模块,通过加入ScanContext全局描述子,进行回环修正,SC-PGO模块与FAST-LIO2解耦,非常方便,很优秀的工作。

z1872385的博客 3189

STL源码剖析——关联容器之map

前言

关注校招求职,微信号:job_campus 3644

Sigrity SPEED2000 General SI Simulation模式如何进行信号仿真分析操作指导-DDR

本例是几个简单的板载DDR颗粒的结构,本例中使用General SI Simulation模式仿真DDR信号,结构拓扑如下,Addcmd,clk,cke都是T拓扑。Sigrity SPEED2000 General SI Simulation模式可以对信号进行仿真分析,仿真将电源视为理想电源,以下图为例进行说明。DQS的接收端模型设置为DQS_34_ODT60_1333。模式如何进行信号仿真分析操作指导-DDR。附带驱动和接收端的IBIS模型。

weixin_54787054的博客 512

实战二:基于LightGBM进行海洋轨迹预测 代码+数据(非常详细可作为毕设)

实战二:基于LightGBM进行海洋轨迹预测 代码+数据(非常详细可作为毕设)

1315

C++ STL源码剖析 10-rb_tree

Red-Black Tree 红黑树

wesigj的博客 2018

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

STL源码剖析——RB_TREE

花了差不多一个星期的时间读完了STL红黑树的实现,并凭理解自己写了出来 参考了《算法导论》,教你透彻了解红黑树,强烈推荐,《STL源码剖析》 记录下自己的理解RB_TREE红黑树优点: 与BST相比插入,查找,删除在最坏情况下的复杂度仍为O(lgn),相比BST应用范围更广 STL容器set,map都以红黑树为底层容器实现,Linux进程调度算法也用红黑树实现四种性质: 1. 每个结点要

ProgrammingLearner的博客 511

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

源码剖析:STL中红黑树(RB-tree)

本文深入解析红黑树(RB-tree)的实现原理与数据结构设计。首先介绍红黑树的五大规则:根黑、不红红、黑路同等特性,并分析了插入节点时的三种情况(根节点、红叔叔、黑叔叔)及对应的旋转操作。对删除操作也分情况讨论,包括单子节点和无子节点场景。详细阐述了红黑树的节点结构设计、迭代器实现(双向迭代器),以及底层数据结构成员定义。最后探讨了红黑树的构造方式(空树/复制)和关键操作:insert_unique(不重复插入)、insert_equal(允许重复)和find查找方法

WildPointer的博客 1144

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

STL源码剖析 - RB-tree

在我看来,看源码是一件既痛苦又兴奋的事。当我们在推敲其中的难点时,是及其痛苦的,但当发现实现代码是那么丝滑简洁时,“wc, nb!”。 1. 导语 如果我们去看关联式容器map、set、multimap、multiset源代码,我们发现绝大部分操作如插入、修改、删除、搜索,均是由其内含的红黑树来完成的,我们有必要去揭开她的神秘面纱,一览她的绝世风姿。 (如果你手头还没有《STL源码剖析》...

yocichen 194

STL源码分析之RB-tree结构简析

所谓关联容器:          每笔数据(每个元素)都有一个键值(key)和一个实值(value)。当元素被插入到关联式容器中时,容器内部结构(可能是RB-Tree 也可能是hash-table)便依照其键值大小,以某种特定规则将这个元素置放于适当的位置。          关联容器没有所谓的头尾(只有最大元素和最小元素),所以不会有所谓的push_back(), push_front(),

博客 795

【红黑树进阶】手撕STL源码:从零封装RB-tree实现map和set

本文深入剖析STL底层设计思想,带你手把手将红黑树封装成自己的map和set。核心内容包括:KeyOfT仿函数解决比较问题、迭代器的完整实现(++/--操作)、map的operator[]重载、const迭代器与const正确性保证。通过完整的代码实现(RBTree.h/Myset.h/Mymap.h),让你彻底理解STL中map/set的复用机制。适合有一定红黑树基础,想深入掌握STL源码精髓的开发者,建议结合源码学习!

燃于AC之乐的博客 879

续 "关于sgi stl为什么使用rb-tree的想法"

这两天继续研究RB_Tree。上次说到为什么sgi stl会选择rb_tree作为set,map的基础实现,而不选择avl_tree。经过对资料的查询,最终,得出的结论是rb_tree在rebalance方面右性能优势。rb_tree的rebalance的时间顶多是进行两次totate,而avl_tree就需要有O(log(N))的时间。那么,这次我们先来研究为什么rb...

a848354317的博客 175

STL源码剖析 - 第5章 关联式容器 - RB-tree(红黑树)

5.1 树的导览      标准的STL关联式容器分为set(集合)和map(映射表)两大类,以及这两大类的衍生体multiset(多键集合)和multimap(多键映射表)。这些容器的底层机制均以RB-tree(红黑树)完成。RB-tree也是一个独立的容器,但并不开放给外界使用。 此外,SGI STL还提供了一个不在标准规格之列的关联式容器:hash table(散列表),以及以此hash

灯火阑珊处 758
上一篇: stl源码剖析 详细学习笔记 RB_tree (1)
下一篇: stl源码剖析 详细学习笔记 set map
boydfd
博客等级 码龄16年 101粉丝 92原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值