《STL源码剖析》笔记-set

STL源码分析 set容器 源代码来自sgi-2.91版本stl_set.h 文章目录set总述set类定义less< key>函数set构造函数begin() 、end()empty()size()find()count()insert()erase() set总述 (1)set的底层实现实际上是一颗红黑树实现 (2)每次插入元素会调整红黑树位置,实现自动排序 (3)key和data是一个值,作为红黑树的value (4)不能插入相同元素值 set类定义 #ifndef __STL_LIMITED_DEFAULT_TE 阅读详情

上一篇:《STL源码剖析》笔记-RB-tree

set容器的特性就是所有元素都会根据键值进行自动排序,和map不同的是set的键值就是实值。并且通过set的迭代器无法改变set的键值,因为改变键值会打破set的排序。set排序的特性能够由rb-tree实现且所需接口rb-tree都已经提供,所以set底层采用了rb-tree。

// 默认使用递增排序
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:
    // 底层为rb-tree
    typedef rb_tree<key_type, value_type,
    identity<value_type>, key_compare, Alloc> rep_type;
    rep_type t; 
public:
    // 指针、迭代器、引用都是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) {}
    
    // 区间赋值构造,使用insert_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;
    }
    
    // set操作,使用rb-tree接口
    key_compare key_comp() const { return t.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.rend(); }
    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); }
    
    // 插入、删除
    typedef  pair<iterator, bool> pair_iterator_bool;
    pair<iterator,bool> insert(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;
}

set使用

#include <set>

int main(int argc, char* argv[])
{
    std::set<int> st = {0, 1, 3, 5};
    for (auto i : st){
        std::cout << i;
    }
    std::cout << std::endl;
    
    st.insert(4);
    for (auto i : st){
        std::cout << i;
    }
    std::cout << std::endl;

    st.insert(1);       // 已经存在插入无效
    for (auto i : st){
        std::cout << i;
    }
    std::cout << std::endl;
    
    auto result = st.find(1);
    if (result  != st.end())
    {
         st.erase(result);
    }
    for (auto i : st){
        std::cout << i;
    }
    std::cout << std::endl;
    
    return 0;
}

// 输出结果:
0135
01345
01345
0345

下一篇:《STL源码剖析》笔记-map

空地多无人平台协同路径规划复现:从建模到Matlab仿真全解析 路径规划是机器人领域的核心基础技术,从单机避障到多平台协同,问题复杂度显著提升。空地协同规划融合无人机与无人车的异构优势,通过将地图分层建模为空中与地面栅格,并采用A*算法生成初始路径、B样条平滑以及改进遗传算法进行任务分配与时间同步优化,能够有效处理几何约束、运动学约束和避碰约束等。该技术广泛应用于区域巡逻、目标搜索、物资转运等任务场景,也是高校论文复现和工程仿真的常见课题。本文从问题建模、算法设计到Matlab代码结构,系统梳理了一套空地多无人平台协同路径规划的复现思路,同时给出坐标系校准、遗传算法收敛 阅读详情

相关推荐

机场数据治理系列介绍(1):机场行业数据中台中的数据管理顶层设计方案

民航机场行业的数据中台中,有关数据管理顶层设计方案需要结合机场行业的业务特点和技术需求进行具体的设计,今日我们简要考量设计提供一个参考方案:

机场信息系统研究员的专栏 1604

STL进阶之树形结构的关联式容器1(set及其底层原理的实现)

1.序列式容器与关联式容器的区别 序列式容器:其底层为线性序列的数据结构,里面储存的是元素本身。 eg:vector,list,string,deque,stack,forward_list(C++11)。 关联式容器:其底层为树形序列的数据结构,里面储存的是<key,value>结构的键值对。 eg:map,set,multimap,multist。 都是用于存储数据,关联式容器不同...

qq_41906009的博客 444

SpringBoot+Git+Jenkins+K8s容器化部署

SpringBoot+Git+Jenkins+K8s容器一套部署流程

可乐加.糖 471

STL中vector/map/set实现原理

(1)vector是顺序容器,本质是一个动态数组,支持随机存取、插入、删除、查找等操作。内存中占用一段连续空间。初始会分配一段内存空间。当元素超出范围时,vector会重新开辟空间,由stl中的allocator分配,新空间大小是原先的2倍,然后将旧数据移动到新空间中,释放旧空间。一旦空间重新分配,指向原vector的所哟迭代器就会失效。(2)map是关联容器,以键值对(key-value)的形式进

鸟恋旧林的博客 602

FPGA高速接口Aurora8B/10B协议实战:从IP核配置到数据流优化

本文详细介绍了FPGA高速接口Aurora8B/10B协议的实战应用,从IP核配置到数据流优化的全流程。通过Aurora8B/10B协议,开发者可以在FPGA间实现高效的数据传输,适用于高速接口设计。文章涵盖了协议基础、IP核配置、AXI4-Stream接口实战技巧以及性能优化策略,帮助读者快速掌握这一关键技术。

weixin_29280657的博客 268

Windows Server 2012 R2虚拟机安装全攻略:从镜像选择到网络配置一步到位

本文提供Windows Server 2012 R2虚拟机安装全攻略,涵盖从镜像选择到网络配置的完整流程。详细讲解在Oracle VM VirtualBox中的安装步骤、TCP/IP网络设置、系统优化及常见问题解决方案,帮助用户快速搭建可立即投入使用的服务器环境。特别适合IT初学者和系统管理员学习传统服务器应用的部署与配置。

weixin_28363123的博客 538

STL容器之 set(原理,成员函数)

文章目录底层实现:红黑树不可以加减运算,只能递增递减,因为内存不连续成员方法初始化clear()erase()insert() 底层实现:红黑树 不可以加减运算,只能递增递减,因为内存不连续 set,map,multiset, mutilmap都是用红黑树实现的,是STL对二叉树的封装,他们的迭代器只支持递增递减运算,不可以加减整数!!!s.end()-1会编译错误。 原来只有内存连续的容器的迭代器可以加减,双端队列的底层用的vector实现,所以也是连续内存,不是用链表实现的,注意哦。 原来++i

wulimmya的博客 1094

JavaScript China城市联动

中国全城市的地址省,市,县 <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title></title> <script src="jquery.js"></script> <script src="json.js"></...

唯唯同学 2241

STL学习笔记-set的基本原理以及插入、遍历

set 关键字保存:通过实值来排序,再通过实值来查找; 特点:高效访问,与map一样,底层都是红黑树,map是分键值对的,set键值即实值,实值即键值; set的键值不能重复。 红黑树:平衡排序二叉树   如下例子,运行截图如下: 源码如下: #include &lt;set&gt; #include &lt;iostream&gt; #include &lt;string&gt; ...

IT1995的博客 7822

接入 deepseek 实现AI智能问诊

必须包含user角色,用于传递用户输入。system角色可选,用于设置对话背景。多轮对话需要将历史记录添加到messages中。

weixin_51326478的博客 6541

【OpenClaw从入门到精通】第07篇:2026实测!零基础开发OpenClaw自定义Skill——招聘外呼自动邀约完整教程

本文聚焦OpenClaw自定义Skill开发全流程,针对现成技能无法满足个性化场景(如专属招聘流程、内部系统对接)的痛点,以“招聘外呼自动邀约”为实战案例,从概念认知、环境搭建、分步开发到测试优化,手把手教读者从零构建自定义Skill。内容涵盖Skill目录结构、SKILL.md核心配置、Python主逻辑实现、API对接、安全配置等关键环节,融入2026年ClawHavoc事件安全警示,强调最小权限、凭证安全等开发原则。所有代码经实测可运行,步骤详尽且兼顾新手友好与进阶需求。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1193

【STL源码剖析】总结笔记(9):set/multiset与map/multimap

00 写在前面 【STL源码剖析】总结笔记(8):红黑树(RB-tree)探究 这篇的内容在红黑树的基础上就显得简单很多了。set和map需要了解其结构,在实际使用STL过程中最好可以做到轻松使用。 因为是红黑树作为底层,所以要注意元素是会自动排序的。 01 set/multiset set set的底层是依靠红黑树来支撑的,所以会根据元素的key自动排序。对于set来说,key就是value,而且set不允许两个元素有相同的key。 同理,我们也不可以修改set的元素值,这一点可以从后面set的iter

斯塔克家的真维斯的工作间 829

3、无限维系统理论中的算子与半群:概念、定理及应用

本博文深入探讨了无限维系统理论中的两个核心概念:里茨谱算子与卢默-菲利普斯定理。文章首先介绍了里茨基的定义与性质,分析了谱、预解集及特征值在无限维系统中的特性,并详细阐述了里茨谱算子的条件及其生成C0-半群的能力,结合阻尼欧拉-伯努利梁模型展示了其应用。随后,文章介绍了卢默-菲利普斯定理及其推论,通过多个偏微分方程实例(如一阶方程、柔性梁、波动方程和扩散问题)说明如何利用该定理判断算子是否生成压缩半群。此外,还强调了状态空间选择和边界条件对系统适定性的重要影响,并总结了相关问题的解决步骤与方法。

flink9streamer的博客 148

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

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

weixin_48956191的博客 1136

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

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

KangRoger的专栏 2119

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

// //  set map.cpp //  笔记 // //  Created by fam on 15/3/23. // // //---------------------------15/03/23---------------------------- //set {     /*      

boydfd的专栏 1105

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

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

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

weixin_48956191的博客 1348

《STL源码剖析》学习笔记——第六章:算法之set

set相关算法 STL提供了四种与set相关的算法,分别是并集(union)、交集(intersection)、差集(difference)和对称差集(symmetric difference),这4个算法接受的set必须是有序区间,都至少接受4个参数,分别表示两个set区间。所谓的set可细分为数学上的定义和STL的定义两种,数学上的set允许元素重复而未经排序,;例如{1,5,5,3,2},STL的定义要求元素不得重复,且必须经过排序,例如{1,3,5,6}。 测试程序如下: #include

baidu_15952103的博客 201

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

STL只规定接口和复杂度,对于具体实现不作要求。set大多以红黑树实现,但STL在标准规格之外提供了一个所谓的hash_set,以hash table实现。hash_set的接口,hash_table都提供了,所以几乎所有的hash_set操作都是直接调用hash_table的函数而已。 除了hash_set,还有hash_multiset,它们两个的关系就像set和multiset的关系,一个不允许键值重复,另外一个允许键值重复。其他实现一样。

KangRoger的专栏 2047

《STL源码剖析》笔记-hash_set、hash_map

上一篇:《STL源码剖析》笔记-hashtable hash_set hash_set底层机制由hashtable提供,和set一样能够快速搜索元素,但是set元素插入后会自动排序,而hash_set是无序的。 template &amp;lt;class Value, class HashFcn = hash&amp;lt;Value&amp;gt;, class EqualKey = equal_to&amp;lt;...

WizardtoH 472

《STL源码剖析》学习笔记-第6章(一) set相关算法

STL中定义的set要求元素不得重复且已经排序。而set算法要求的都是有序区间(输出也是有序的),但元素可以重复出现。STL提供了4个set相关的算法,分别是并集(union)、交集(intersection)、差集(difference)和对称差集(symmetric difference),这4个算法接受的set必须是有序区间,都至少接受4个参数,分别表示两个set区间。一般而言,set算法前4

爱橙子的OK绷的专栏 965

《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

【STL源码剖析读书笔记】【第6章】算法之set相关算法

1、 STL提供了4个set相关的算法,分别是并集(union)、交集(intersection)、差集(difference)和对称差集(symmetric difference),这4个算法接受的set必须是有序区间,都至少接受4个参数,分别表示两个set区间。 2、 set相关算法源代码 //并集,求存在于[first1, last1)或存在于[first2, last2)内...

weixin_30807779的博客 95

stl map 查找不到返回什么_读书笔记:《STL源码剖析》-III

此篇章为《STL源码剖析》的读书笔记。对应于读书笔记:《STL源码剖析》-II 在需要作出解释的地方,我会添加相应的注释,结合视频学习,与笔者的知识储备。如果有任何错误,或者疑虑,请发送邮件至ashior@qq.com。[TOC]关联式容器关联式容器分为set(集合)和map(映射表)两大类,以及这两大类的衍生体multiset(多键集合)和multimap(多键映射表)。这些容器的底层机制均以...

weixin_39804620的博客 437

【STL源码剖析读书笔记】【第5章】关联式容器之set、map、multiset和multimap

一、set 1、  set的特性是所有元素都会根据元素的键值自动排序,set元素的键值就是实值,实值就是键值。 2、  不能通过set的迭代器改变set的元素,setiterators是一种constant iterators。 3、  客户端对set进行元素新增或者删除操作时,操作之前的所有迭代器在操作后都依然有效,被删除的元素的迭代器例外。 4、  STL set以RB-tree为底层

ruan875417的专栏 573
上一篇: 《STL源码剖析》笔记-RB-tree
下一篇: 《STL源码剖析》笔记-map
WizardtoH
博客等级 码龄12年 633粉丝 95原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值