stl源码剖析 详细学习笔记 set map

STL源码剖析(侯杰)——读书笔记 文章目录STL源码剖析(侯杰)——读书笔记1. STL概论2.空间配置器SGI标准空间配置器, std::allocatorSGI特殊的空间配置器, std::alloc构造和析构 construct()和destroy()空间配置与释放3.迭代器概念与traits编程概念迭代器相应型别传递Traits编程技法——STL源码门钥Partial Specialization(偏特化)的意义std::iterator的保证4.序列式容器vector**list**dequestackqueueheappri 阅读详情

//

//  set map.cpp

//  笔记

//

//  Created by fam on 15/3/23.

//

//



//---------------------------15/03/23----------------------------


//set

{

    /*

        set概述:

        1:所有的元素都会被自动排序,

        2:所有的元素只有"键"没有“值” 或者说他们的“值”就是“键”

        3:不允许出现两个相同的键值

        4:不能通过迭代器改变set的值,因为set的值就是键,

        如果可以改变,我们要先删除键,平衡二叉树,再加改变后的键,再平衡

        这么做严重破坏了set的组织,iterator也会变得无效,到底是指向之前的位置

        还是指向改变后的位置等等。所以stl中不允许改变set的值。

        5:set用RB_tree作为底层机制(废话,不然干嘛花大篇幅介绍RB_tree)

    */

    

    //class

    template<class Key, class Compare = less<Key>,

            class Alloc = alloc>

    class set

    {

    public:

        typedef Key key_type;

        typedef Key value_type;

        typedef Compare key_compare;

        typedef Compare value_compare;

        

    private:

        

        //identity<value_type> 可以根据key值得到value值

        typedef rb_tree<key_type, value_type,

        identity<value_type>, key_compare, Alloc> rep_type;

        rep_type t;

        

    public:

        //由于上面说的set不能改变值,所以指针和迭代器引用这些 全都用RB_tree中的const类型的来指定

        typedef typename rep_type::const_pointer pointer;

        typedef typename rep_type::const_pointer const_pointer;

        typedef typename rep_type::const_reference reference;

        typedef typename rep_type::const_reference const_reference;

        typedef typename rep_type::const_iterator   iterator;

        typedef typename rep_type::const_iterator   const_iterator;

        typedef typename rep_type::const_reverse_iterator reverse_iterator;

        typedef typename rep_type::const_reverse_iterator const_reverse_iterator;

        typedef typename rep_type::size_type    size_type;

        typedef typename rep_type::difference_type difference_type;

        

        

        set() : t(Compare()){}

        explicit set(const Compare& comp) : t(comp){}

        

        //inset_unique 是不允许相同值出现的插入

        template<class InputIterator>

        set(InputIterator first, InputIterator last)

            : t(Compare()){ t.insert_unique(first, last);}

        

        template<class InputIterator>

        set(InputIterator first, InputIterator last,const Compare& comp)

            : t(comp){t.insert_unique(first, last);}

        

        set(const set<Key, Compare, Alloc>& x): t(x.t){}

        set<Key, Compare, Alloc>& operator=(const set<Key, Compare, Alloc>& x)

        {

            t = x.t;

            return *this;

        }

        

        key_compare key_comp() const { return t.key_comp();}

        //set中的值就是键 所以调用key_comp()

        value_compare       value_comp()    const {return t.key_comp();}

        iterator            begin()         const {return t.begin();}

        iterator            end()           const {return t.end();}

        reverse_iterator    rbegin()        const {return t.rbegin();}

        reverse_iterator    rend()          const {return t.end();}

        bool                empty()         const { return t.empty();}

        size_type           size()          const { return t.size();}

        size_type           max_size()      const { return t.max_size();}

        void swap(set<Key, Compare, Alloc>& x) { t.swap(x.t);}

        

        //insert erase

        typedef pair<iterator, bool> pair_interator_bool;

        

        pair<iterator, bool> inset(const value_type& x)

        {

            pair<typename rep_type::iterator, bool> p =t.insert_unique(x);

            return pair<iterator, bool>(p.first, p.second);

        }

        

        iterator insert(iterator position, const value_type& x)

        {

            typedef typename rep_type::iterator rep_iterator;

            return t.insert_unique((rep_iterator&)position, x);

        }

        

        template<class InputIterator>

        void insert(InputIterator first, InputIterator last)

        {

            t.insert_unique(first, last);

        }

        

        void erase(iterator position)

        {

            typedef typename rep_type::iterator rep_iterator;

            t.erase((rep_iterator&)position);

        }

        

        size_type erase(const key_type& x)

        {

            return t.erase(x);

        }

        void erase(iterator first, iterator last)

        {

            typedef typename rep_type::iterator rep_iterator;

            t.erase((rep_iterator&)first, (rep_iterator&)last);

        }

        

        void clear() { t.clear();}

        

        //

        iterator find(const key_type& x) const { return t.find(x); }

        size_type count(const key_type& x) const { return t.count(x); }

        iterator lower_bound(const key_type& x) const

        {

            return t.lower_bound(x);

        }

        iterator upper_bound(const key_type& x) const

        {

            return t.upper_bound(x);

        }

        pair<iterator,iterator> equal_range(const key_type& x) const

        {

            return t.equal_range(x);

        }

        

        friend bool operator== __STL_NULL_TMPL_ARGS (const set&, const set&);

        friend bool operator<  __STL_NULL_TMPL_ARGS (const set&, const set&);

        

    };

    

    

    template<class Key, class Compare, class Alloc>

    inline bool operator==(const set<Key, Compare, Alloc>& x,

                           const set<Key, Compare, Alloc>& y)

    {

        return x.t == y.t;

    }

    

    template<class Key, class Compare, class Alloc>

    inline bool operator<(const set<Key, Compare, Alloc>& x,

                           const set<Key, Compare, Alloc>& y)

    {

        return x.t < y.t;

    }

    

    // 总结

    //没什么好总结的,这里只是不断调用底层的东西,没有技术可言

    

}



//map

{

    /*

        map概述:

        和set不同的就是,多了一个值的概念,每一个键都可以存储一个实值

        排序是根据key(键)来排序的。一般都是根据key来取其中的值。

        和set一样的原理,我们不能改变键。和set不同的是,可以改变data(实值)

        实值只是节点所存储的东西,当然可以改,改了不会影响排序

    */

    

    //struct pair

    

    template<class T1, class T2>

    struct pair

    {

        typedef T1 first_type;

        typedef T2 second_type;

        

        T1 first;

        T2 second;

        

        pair() : first(T1()), second(T2()){}

        pair(const T1& a,const T2& b) : first(a), second(b){}

    };

    

    

    template<class Key, class T, class Compare = less<Key>,

                                    class Alloc = alloc>

    class map

    {

    public:

        typedef Key key_type;

        typedef T data_type;

        typedef T mapped_type;

        typedef pair<const Key, T> value_type;

        typedef Compare key_compare;

        typedef Compare value_compare;

        

        

        class value_compare

        : public binary_function<value_type, value_type, bool>

        {

            friend class map<Key, T, Compare, Alloc>;

            

        protected:

            Compare comp;

            value_compare(Compare c) : comp(c) {}

            

        public:

            bool operator()(const value_type& x, const value_type& y) const

            {

                return comp(x.first, y.first);

            }

        };

        

    private:

        

       

        typedef rb_tree<key_type, value_type,

        select1st<value_type>, key_compare, Alloc> rep_type;

        rep_type t;

        

    public:

        

        typedef typename rep_type::pointer pointer;

        typedef typename rep_type::const_pointer const_pointer;

        typedef typename rep_type::reference reference;

        typedef typename rep_type::const_reference const_reference;

        typedef typename rep_type::iterator   iterator;

        typedef typename rep_type::const_iterator   const_iterator;

        typedef typename rep_type::reverse_iterator reverse_iterator;

        typedef typename rep_type::const_reverse_iterator const_reverse_iterator;

        typedef typename rep_type::size_type    size_type;

        typedef typename rep_type::difference_type difference_type;

        

        

        map() : t(Compare()){}

        explicit map(const Compare& comp) : t(comp){}

        

        //inset_unique 是不允许相同值出现的插入

        template<class InputIterator>

        map(InputIterator first, InputIterator last)

        : t(Compare()){ t.insert_unique(first, last);}

        

        template<class InputIterator>

        map(InputIterator first, InputIterator last,const Compare& comp)

        : t(comp){t.insert_unique(first, last);}

        

        map(const set<Key, Compare, Alloc>& x): t(x.t){}

        map<Key, Compare, Alloc>& operator=(const map<Key, Compare, Alloc>& x)

        {

            t = x.t;

            return *this;

        }

        

        key_compare         key_comp()      const { return t.key_comp();}

        value_compare       value_comp()    const { return t.value_compare(t.key_comp());}

        iterator            begin()         const { return t.begin();}

        iterator            end()           const { return t.end();}

        reverse_iterator    rbegin()        const { return t.rbegin();}

        reverse_iterator    rend()          const { return t.end();}

        bool                empty()         const { return t.empty();}

        size_type           size()          const { return t.size();}

        size_type           max_size()      const { return t.max_size();}

        void swap(set<Key, Compare, Alloc>& x) { t.swap(x.t);}

        

        //map可以根据 键 来取 值, 如果不存在就插入一个新的 键值对

        T& operator[] (const key_type& k)

        {

            return (*((insert(value_type(k,T()))).first)).second;

        }

        

        //insert erase

        

        pair<iterator, bool> inset(const value_type& x)

        {

            pair<typename rep_type::iterator, bool> p =t.insert_unique(x);

            return pair<iterator, bool>(p.first, p.second);

        }

        

        iterator insert(iterator position, const value_type& x)

        {

            typedef typename rep_type::iterator rep_iterator;

            return t.insert_unique((rep_iterator&)position, x);

        }

        

        template<class InputIterator>

        void insert(InputIterator first, InputIterator last)

        {

            t.insert_unique(first, last);

        }

        

        void erase(iterator position)

        {

            typedef typename rep_type::iterator rep_iterator;

            t.erase((rep_iterator&)position);

        }

        

        size_type erase(const key_type& x)

        {

            return t.erase(x);

        }

        void erase(iterator first, iterator last)

        {

            typedef typename rep_type::iterator rep_iterator;

            t.erase((rep_iterator&)first, (rep_iterator&)last);

        }

        

        void clear() { t.clear();}

        

        //

        iterator find(const key_type& x) const { return t.find(x); }

        size_type count(const key_type& x) const { return t.count(x); }

        iterator lower_bound(const key_type& x) const

        {

            return t.lower_bound(x);

        }

        iterator upper_bound(const key_type& x) const

        {

            return t.upper_bound(x);

        }

        pair<iterator,iterator> equal_range(const key_type& x) const

        {

            return t.equal_range(x);

        }

        

        friend bool operator== __STL_NULL_TMPL_ARGS (const set&, const set&);

        friend bool operator<  __STL_NULL_TMPL_ARGS (const set&, const set&);

        

    };

    

    

    template<class Key, class Compare, class Alloc>

    inline bool operator==(const set<Key, Compare, Alloc>& x,

                           const set<Key, Compare, Alloc>& y)

    {

        return x.t == y.t;

    }

    

    template<class Key, class Compare, class Alloc>

    inline bool operator<(const set<Key, Compare, Alloc>& x,

                          const set<Key, Compare, Alloc>& y)

    {

        return x.t < y.t;

    }

    

    /*

        总结:

        map和set不同的是有了data这个概念,并且可以更改这个data值了

        set插入时插的就是key, map插入时插的是value(键值对)

        插入时,函数会调用keyofvalue仿函数取得value的key

        之后排序会根据key_compare(也就是模版参数中的Compare)来比较key的大小

        最后都是用key来比较的,不同的是set存的值也是key,map存的值是data。

        

    */

    

    

}



//multiset 和multimap


/*

    这两个容器和之前的基本相同,不同的就是把inset_unique改成inset_equel

    具体的底层实现在RB_tree 中已经实现了,只要调用就行了

*/

STL源码剖析总结 记录侯捷《STL源码剖析》感悟学习 阅读详情

相关推荐

图像超分辨率在医学影像中的应用:如何用深度学习提升CT/MRI图像质量

本文探讨了深度学习驱动的图像超分辨率技术在医学影像(如CT/MRI)质量提升中的应用。文章分析了医学图像超分辨率在提升诊断信息含量、平衡保真度与临床相关性方面的独特挑战,并详细介绍了如何针对3D体数据特点定制模型架构、设计病理感知损失函数,以及解决高质量配对数据稀缺的策略。通过实战案例,阐述了从数据模拟、模型训练到临床评估的完整流程,旨在为医学影像的清晰化与诊断精准化提供有效解决方案。

weixin_29063681的博客 523

《STL源码剖析》---stl_set.h阅读笔记

SET是STL中的标准容器,SET里面的元素会根据键值自动排序,它底层数据结构是红黑树。

KangRoger的专栏 2119

零零信安:暗网分析报告——Part 4 商业黑客组织,“流星街”的原住

暗网,作为互联网的一部分,充满了神秘而又复杂的活动。更重要的是,其背后的主要参与者——商业黑客和各种有组织的犯罪集团,揭示了这是一个怎样的世界。本报告将试图带您了解这些原住民的身份、行为方式、商业逻辑、受害者以及他们构建的独特生态。

miffy_00sec的博客 636

《STL源码剖析》-- stl_set.h

// Filename: stl_set.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog: http://blog.youkuaiyun.com/mdl13412 /* * * Cop

一个人的战争 3315

WorkBuddy任务对话上下文管理:Token、compact与上下文窗口实战指南

在大语言模型应用中,Token作为文本处理的最小单位,直接决定上下文窗口的消耗速度,而上下文窗口则限定了单次对话可承载的信息总量。当对话超出窗口限制时,compact压缩机制会触发有损摘要,导致关键约束丢失或工具调用结果被稀释。合理管理上下文不仅能提升多步骤任务的稳定性,还能显著降低Token成本与响应延迟。在文档处理、代码开发、多步自动化等场景中,通过主动压缩、状态外置、分段喂入等策略,可有效避免任务后期遗忘、版本混乱等问题。本文围绕WorkBuddy的上下文管理机制,从Token与compact的底层原

weixin_29055699的博客 391

【逐函数讲解ORB_SLAM3源码】获取普通帧率、关键帧、IMU数据

获得imu的旋转 mRwc * mImuCalib.mTcb.rotationMatrix(); Sophus::SE3 mTwc 创建ORB_SLAM3系统 Create SLAM system. It initializes all system threads and gets ready to process frames. ORB_SLAM3::System SLAM(argv[1],argv[2],ORB_SLAM3::System::IMU_RGBD, true, 0, file_nam

小秋 AI SLAM 入门实战教程 1245

STL源码——RB-Tree insert操作

看STL源码剖析时,真正的插入函数__insert(base_ptr x, base_ptr y, const value& v)时,发现参数x几乎没什么用,查了一些资料,发现x是在调用另一个insert重载函数时发挥作用的,于是整理了一下insert函数。

ww32cc的博客 1966

【云原生进阶之容器】第六章容器网络6.6.2--Cilium部署

部署Cilium非常简单,可以通过单独的yaml文件部署全部组件(目前我使用了这个方式部署了1.7.1版本),也可以通过Helm Chart一键完成。重要的是部署环境和时机:官方建议所有部署节点都使用Linux最新稳定内核版本,这样所有的功能都能启用。作为一个Kubernetes网络组件,它应该在部署Kubernetes其他基础组件之后,才进行部署。

junbaozi的专栏 792

STL 之 set 源码剖析

G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_set.h 完整列表 /* * * Copyright (c) 1994 * Hewlett-Packard Company * * Permission to use, copy, modify, distribute and sell this software * and its documentat

hustyangju的足迹 1912

MaxScript批量修改材质、贴图名称

MaxScript批量修改材质、贴图名称1 实现效果1.1 修改前材质、贴图名称1.2 修改后2 代码 1 实现效果 1.1 修改前材质、贴图名称 1.2 修改后 2 代码 prefixName = "prefiname" maxFile = "maxfilepath" makeDir "newBitmappath" mapsPath = newbitmappath + "\\" fn formatStr index = ( str = index as string newS

郑德帅 3241

LVGL 磁罗盘效果

环境:LVGL 9.x + SDL2,窗口 1280×800。界面文案用英文(默认 Montserrat,无 CJK)。本文按实现顺序讲:先建立两个耦合转动体,再把磁倾角误差从卡面倾斜里推出来,最后用同一套投影把刻度、数字和目标画到卡上。画面上的迟滞、涡流、摆动和读数偏差都来自方程,没有补间动画。

摸鱼专家 88

《STL源码剖析》学习笔记——第五章:关联式容器 set和 map

目录 1. set概述 1.1 set测试程序 1.2multiset 2. map概述 2.1 map测试程序 2.2multiset 1. set概述 set的特性是,所有元素都会根据元素的键值自动排序,set的元素不像map那样可以同时拥有实值和键值,set元素的键值就是实值,实值就是键值,且不允许两个元素有相同的键值。set具有以下特点: 不能通过set的迭代器改变set的元素,setiterators是一种constant iterators。 客户端对set进行元素新增...

baidu_15952103的博客 344

GEE:本地影像上传到GEE的Assets中,并输入机器学习算法中作为特征变量

当我们在 Google Earth Engine(GEE)中应用机器学习算法时,会输入一些影像作为特征变量数据,进一步根据这些特征影像去推理未知区域的数据。但是 GEE 平台上计算特征变量的 API 函数并不是非常全面,我们希望获得更多的特征用于分类。这个时候,我们可以将本地计算的特征影像上传到 GEE 中进行后续处理。本文记录了从本地上传特征数据到 GEE 的 Assets 中的教程,用于后续在 GEE 中分类或者回归使用。本文也可作为《》一文的补充。

养乐多的博客 1730

侯捷——STL源码剖析 笔记

侯捷——STL源码剖析 笔记 1.总览 1.STL六大部件之间的关系 在下图中,我们使用了如下: 1.一个容器vector 2.使用vector时,使用分配器分配内存 3.使用vi.begin(),vi.end()即迭代器,作为算法的参数 4.使用count_if算法 5.使用仿函数less() 6.使用函数适配器来对我们算法的结果进行进一步筛选(not1, bind2nd) 2.复杂度 3.迭代器区间 迭代器是一个左开右闭的区间,也就是说迭代器的end是最后一个元素的下一个元素。 4.容器的结构和

weixin_45067603的博客 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C++学习:map/set源码剖析+利用红黑树封装map/set

前面我们已经学习了红黑树这个高级数据结构的实现。我们知道STL的map/set的底层数据结构为红黑树,本期就查看STL源码的map/set,并结合着这之前的红黑树的实现,模拟实现map和set的一部分功能 STL源码:楼田莉子/CPP代码学习 作者的个人gitee:楼田莉子/CPP代码学习喜欢请支持一下,谢谢目录STL——map/set源码剖析 解析模拟实现set/map 复用之前红黑树的代码实现my_set/my_map,并实现Insert功能

2401_89119815的博客 1102

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

c++STL——红黑树封装set与map:深入源码解析

c++STL——红黑树封装map和set

2301_79705195的博客 1013

【C++】STL之map、set类源码剖析

C++千行代码实现stl标准库中的map、set的封装,剖析map、set的设计原理和特性,以及其底层数据结构红黑树的设计原理、迭代器特性、泛型的应用。

phoenixFlyzzz的博客 2857

STL map / set 底层机制: 红黑树完全剖析

前言: 在 STL 的容器中两大阵营 (vector deque list forward_list) 顺序容器 与 关联容器 (map set unorder_map unorder_set) 。 关联容器指的是以关键字匹配指定数据的一种关联数据结构的集合, 在关联容器中通过关键字去查找对应的数据是非常块的, 下面我们会彻底地去剖析其底层实现机制 : 红黑树。 由基础树 到 二叉搜索树 介绍红黑树之前,容许我介绍树的概念。 1. 树(tree), 在计算机科学中,是十分基础的数据结构: .

专注游戏研发 3365

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

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

weixin_48956191的博客 1136

STL源码剖析笔记——哈希表、unordered_set、unordered_map、unordered_mutiset、unordered_mutimap

STL源码剖析笔记——哈希表、unordered_set、unordered_map、unordered_mutiset、unordered_mutimap

weixin_48956191的博客 1348

必读篇!STL关联式容器set、map、multiset、multimap源码剖析

set语法使用参阅:https://blog.youkuaiyun.com/qq_41453285/article/details/100620892 map语法使用参阅:https://blog.youkuaiyun.com/qq_41453285/article/details/100609447 一、set set的特性 set所有元素都会根据元素的键值自动被排序 set中的键值就是实值,实值就是键值 ...

董哥的黑板报 1323

C++ STL源码剖析 16-unordered_set

点击直达——文章总目录在 C++ 标准模板库(STL)中, 是一种基于哈希表实现的容器,用于存储唯一的元素。它允许快速访问、插入和删除操作,而不需要维护元素的顺序。 的性能通常比 更好,尤其是在元素的查找和插入操作中。以下是 的一些主要特性:基本用法: 自定义哈希函数和键比较函数: 在这个例子中,我们定义了一个 结构,它将用作 的元素。我们还提供了自定义的哈希函数 和键比较函数 。注意: 是 C++ STL 中非常有用的容器之一,适用于需要快速访问元素的场景,特别是当元素的顺序不重要时。 和 都

wesigj的博客 1078

STL容器-set、map、multiset、multimap(源自STL源码剖析)

multimap 的特性以及用法与 map 完全相同,唯一的差别在于它允许键值重复,因此它的插人操作采用的是底层机制 RB-tree 的 insert_equal() 而非 insert_unique()。

2401_83197485的博客 1374

【C++】STL之unoerdered_map、unordered_set类源码剖析

C++通过哈希表实现对unordered_map、unordered_set的封装

phoenixFlyzzz的博客 2502

手搓STL库中 ——《map && set》

我们从一开始接触map和set时就惊叹于这两个容器的强大之处,set可以高效的为我们进行排序去重,而map就像一个字典一样,不仅可以为我们实现去重排序,也可以帮助我们进行一一对应的查找。接下来我们又学习了AVL树和红黑树,我们也算是了解到了map和set的底层是基于红黑树实现的。因此现在我们已经具备对map和set进行自主实现了!在你阅读本章之前,你需要熟悉红黑树的特性,以及我们之前对list容器进行的自主实现。

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值