详解C++ STL set 容器

【C++STL中的set和multiset容器详解】——掌握STL中红黑树容器的使用方法 set是一种基于红黑树实现的关联容器,它内部存储的元素是唯一的,并且按照二叉搜索树的特性进行排序。因此,在插入、删除和查找元素时,set都具有非常高效的性能。本文详细介绍了C++ STL库中的set和multiset容器,包括它们的定义、操作和性能分析。通过学习本文,读者可以掌握STL中红黑树容器的使用方法,进一步提升自己的编程能力。 阅读详情

本篇随笔简单介绍一下C++STLC++STL 中setset 容器的使用方法及常见使用技巧。

set容器的概念和性质

setset 在英文中的意义是:集合。setset 容器也的确“人如其名”,实现了这个集合的功用。

高中数学必修一集合那章(高一以下的小伙伴不用慌,不讲数学只讲概念),关于集合的性质,给出了三个概念:无序性、互异性、确定性。

那么,setset 容器的功用就是维护一个集合,其中的元素满足互异性。

我们可以将其理解为一个数组。这个数组的元素是两两不同的。

这个两两不同是指,如果这个setset 容器中已经包含了一个元素ii ,那么无论我们后续再往里假如多少个ii ,这个setset 中还是只有一个元素ii ,而不会出现一堆ii 的情况。这就为我们提供了很多方便。

但是,需要额外说明的是,刚刚说集合是有无序性的,但是setset 中的元素是默认排好序(按升序排列)的。(稍微说一句,setset 容器自动有序和快速添加、删除的性质是由其内部实现:红黑树(平衡树的一种)。这个东西过于高深我不会,所以不予过多介绍,有兴趣的小伙伴可以自行浏览相关内容。)

set容器的声明

setset 容器的声明和大部分C++STLC++STL 容器一样,都是:容器名<变量类型> 名称的结构。前提需要开#include库。如:

#include<set>
set<int> s;
set<char> s;
set<pair<int,int> > s;
set<node> s;
struct node{...};

set容器的使用

其实,C++STLC++STL 容器的使用方式都是差不多的。我们完全可以举一反三地去类比。与bitsetbitset 重定义了许多奇形怪状新的函数之外,其他都是大致相同的。所以笔者在此不再做幼稚的介绍,大家都是竞赛狗,应该都能自己看明白。

s.empty();

empty()empty() 函数返回当前集合是否为空,是返回1,否则返回0.

s.size();

size()size() 函数返回当前集合的元素个数。

s.clear();

clear()clear() 函数清空当前集合。

s.begin(),s.end();

begin()begin() 函数和end()end() 函数返回集合的首尾迭代器。注意是迭代器。我们可以把迭代器理解为数组的下标。但其实迭代器是一种指针。这里需要注意的是,由于计算机区间“前闭后开”的结构,begin()begin() 函数返回的指针指向的的确是集合的第一个元素。但end()end() 返回的指针却指向了集合最后一个元素后面一个元素。

s.insert(k);

insert(k)insert(k) 函数表示向集合中加入元素kk 。

s.erase(k);

erase(k)erase(k) 函数表示删除集合中元素kk 。这也反映了setset 容器的强大之处,指哪打哪,说删谁就删谁,完全省略了遍历、查找、复制、还原等繁琐操作。更不用像链表那种数据结构那么毒瘤。直接一个函数,用O(logn)O(logn) 的复杂度解决问题。

s.find(k);

find(k)find(k) 函数返回集合中指向元素kk 的迭代器。如果不存在这个元素,就返回s.end()s.end() ,这个性质可以用来判断集合中有没有这个元素。

其他好用的函数

下面介绍一些不是很常用,但是很好用的setset 容器的内置函数

s.lower_bound(),s.upper_bound();

熟悉algorithmalgorithm 库和二分、离散化的小伙伴会对这两个函数比较熟悉。其实这两个函数比较常用。但是对于setset 集合来讲就不是很常用。其中lower_boundlower_bound 返回集合中第一个大于等于关键字的元素。upper_boundupper_bound 返回集合中第一个严格大于关键字的元素。

s.equal_range();

这个东西是真的不常用...可能是我太菜了。

这个东西返回一个pairpair (内置二元组),分别表示第一个大于等于关键字的元素,第一个严格大于关键字的元素,也就是把前面的两个函数和在一起。如果有一个元素找不到的话,就会返回s.end()s.end() 。

C++ STL中的set容器:类排序实现技术详解 STL是C++编程语言的一个重要组成部分,它提供了诸多通用的数据结构和算法。set容器作为一个有序的集合,它使用红黑树实现,能够保证元素的唯一性,并提供快速的查找、插入和删除操作。理解set容器如何融入STL,意味着你能够更好地利用C++的强大功能来优化你的代码。红黑树是一种自平衡的二叉搜索树,它在计算机科学中广泛应用于实现关联数组。红黑树通过在节点中引入一个额外的属性——颜色(红色或黑色)来维持树的平衡。在红黑树中,任何节点都必须是红色或黑色,而树的根节点始终为黑色。 阅读详情

相关推荐

Linear超高PSRR线性稳压器-典型应用电路解析

本文整理完了LT3045数据手册内所有的典型应用电路,试图让沉默的电路开口,简单介绍了他们这样做的目的和原理,从中我们可以更加熟悉这颗经典芯片的应用。但也有一些电路并没有搞懂,遗留下了不少问题。

硬件工程师笔记 2943

C++set容器-内置类型指定排序

set容器排序 利用访函数,可以改变排序规则 一、set存放内置数据类型 代码如下: #include <iostream> using namespace std; #include <set> class Mycompare { public: bool operator()(int v1, int v2) { return v1 > v2; } }; //set容器排序 void test01() { set<int >s1; s1.i

m0_51955470的博客 692

深入解析Cuk、Zeta和Sepic拓扑:非隔离型开关电源的设计奥秘

本文深入解析了Cuk、Zeta和Sepic三种非隔离型开关电源拓扑的设计奥秘。它们均能实现升降压转换,但特性各异:Cuk拓扑输出反向电压,输入输出纹波极低;Sepic拓扑输出同极性电压,应用广泛;Zeta拓扑输出纹波小,适合精密供电。文章详细对比了其电路结构、工作原理、核心公式及选型指南,帮助工程师根据输入电压范围、输出极性及纹波要求,灵活选择最合适的拓扑方案。

weixin_28308325的博客 478

C语言中extern修饰符的用法

今天休假,大概总结一下extern在C/C++语言中的常见用法吧。不是为了说明茴香豆有多种写法,而是发现很多同事,包括我自己,使用的时候还是经常犯晕。 在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。0. extern修饰变量的声明。举例来说,如果文件a.c需要引用b.c中变量int v,就可以在a.c中声明extern int

levine 4206

某二级支行网络的设计与实现——配置脚本(1)

【代码】某二级支行网络的设计与实现——配置脚本(1)

u010311846的博客 577

5分钟搞定!用Keil MDK将STM32F103C8T6工程无缝迁移到ZET6开发板

本文详细介绍了如何在Keil MDK环境下快速将STM32F103C8T6工程迁移到ZET6开发板,涵盖硬件差异对比、工程配置调整、外设适配及编译排错等关键步骤,帮助开发者5分钟内完成工程移植,大幅提升开发效率。

weixin_30879169的博客 409

STL中set的基本介绍

STl中的基本内容 容器 set/multiset 在集合中,所有的元素只能出现一次,并且默认按照元素的值从小到大自动排序 set不能通过迭代器来修改元素的值,即set的迭代器是一种const_iterator multiset 和 set 的区别在于multiset中允许有重复的元素 内部采用的是一种非常高效的平衡检索二叉树:红黑树,也成为RB树(Red-Black Tree)。RB树的统计性能要好于一般平衡二叉树,所以被STL选择作为了关联容器的内部结构。这种结构使得集合在进行插入删除的时候,具有较高的

NKU_lyx的博客 2446

手把手教你用Deep Single-Image Portrait Relighting实现人像光影重塑(附GitHub代码)

本文提供了一份详细的实战指南,手把手教你利用Deep Single-Image Portrait Relighting技术实现人像光影重塑。文章从环境搭建、核心原理拆解出发,逐步指导构建简易重光照流程,并探讨了使用预训练模型进行效果优化的进阶方法,最后附上避坑指南与常见问题排查,帮助开发者快速上手这一AI图像处理技术。

weixin_29065015的博客 316

C++使用全局变量的extern方式

def.h中声明extern int m; def.cpp中int m; 两个文件必须要有 在主程序中添加头文件,include “def.h”后,就可以直接使用m变量。

苦茶Fighting的博客 2867

RTX 50系列显卡选购指南:从Stable Diffusion到深度学习,哪款最适合你的AI需求?

本文深入分析了RTX 50系列显卡如何满足不同的AI应用需求。针对Stable Diffusion图像生成,强调显存容量是关键;对于大语言模型本地推理,需平衡算力与显存;而深度学习训练则更看重算力效率。文章对比了RTX 5090、5080、5070等型号的核心规格与适用场景,并提供了从入门到专业的实战配置建议,帮助用户根据自身AI工作负载精准选择最具性价比的显卡。

linux6sysadmin的博客 691

USB摄像头开发避坑指南:UVC协议中的Alternate Setting详解

本文深入解析UVC协议中的Alternate Setting机制,这是USB摄像头开发中影响视频流稳定性的关键。文章通过实际案例,详解了Alternate Setting如何管理USB带宽分配,并分析了帧率不达标、图像花屏等典型问题的根源与排查方法,为开发者提供实用的避坑指南和调试技巧。

meat5的博客 240

c++笔记 STL set容器_内置类型指定排序规则

//set容器默认排序为从小到大,掌握如何改变排序规则 //利用仿函数,可以改变排序规则 #include<iostream> #include<set> using namespace std; //仿函数:用类调用函数 //仿函数设计: class MyCompare { public: //下一行末尾加上const /*bool operator()(int v1, int v2){ return v1 > v2; }*/ bool operator()(i.

qq_45949701的博客 359

【YOLOv8改进-注意力机制】BRA(bi-level routing attention ):双层路由注意力

【YOLOv8改进-注意力机制】BRA(bi-level routing attention ):双层路由注意力我们提出了一种新颖的动态稀疏注意力机制,通过双层路由实现更加灵活且具有内容感知的计算分配。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 3171

C++ STL set容器详解

C++ set容器set/multiset容器的概念1.set的构造和赋值2.set的大小和交换3.set的插入和删除4.set的查找和统计5.set和multiset的区别6.pair对组的创建7.set容器的排序规则 set/multiset容器的概念 特点:所有元素都会在插入时自动被排序 本质:set/multiset属于关联式容器,底层结构是用二叉树实现的 set和multiset的区别: set不允许容器中有重复的元素 multiset允许容器中有重复的元素 注意:使用set或multis

qq_52324409的博客 4427

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

计算机控制技术及应用

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

【C++ STL】 容器详解:set 学习

/ 定义一个空的set,存储int类型的元素// 使用初始化列表初始化set// 使用另一个set初始化// 遍历 setreturn 0;5 10 15 20可以看到,set自动按照升序排序。如果需要按降序存储元素,可以使用比较函数或Lambda 表达式。可以使用20 15 10 5it!= s.end();++it) {// 输出: 5 4 3 2 1。

King_lxh的博客 847

怀旧版电脑GBC模拟器

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

C++ STL 中的 set 和 multiset 容器详解2

在 C++ 标准模板库(STL)中,set和multiset是两种非常重要的关联容器。它们都基于红黑树实现,能够自动对元素进行排序。本文将详细解析这两种容器的特性、用法和区别。自动排序set和multiset都会自动对元素进行排序,默认是升序排列。可以通过自定义比较函数改变排序方式。

2301_80167761的博客 773

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

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

C++ STL Set容器详解

Set容器 set/ multiset 容器 1 set基本概念 简介: 所有元素都会在插入时自动被排序 本质: set/multiset属于关联式容器,底层结构是用二叉树实现。 set和multiset区别: set不允许容器中有重复的元素 multiset允许容器中有重复的元素 2 运算符 Set 版本 Multiset 版本 描述 operator! = (set) operator! = (multiset) 测试运算符左侧的 set 或 multiset 对象是否不等于

frighting_ing的博客 954

C++STL中的set容器详解

C++中的set容器详解 ● set容器中的元素都是由小到大排好序的。 ● set容器中没有重复的元素。 set的基本操作如下: 关于迭代器的理解,可以把迭代器理解为数组的下标。begin()返回指向容器中第一个元素的迭代器。end ()返回的不是指向最后一个元素的迭代器,而是指向最后一个元素后面的位置的迭代器。以数组a[5]为例,begin()就相当于下标0,end()就相当于下标5。 代...

信小海 1325

【C++ STL】 容器——unordered_set详解

定义和初始化// 定义一个空的unordered_set,存储int类型的元素// 使用初始化列表初始化unordered_set// 使用另一个unordered_set初始化// 遍历 unordered_setreturn 0;如果存储自定义类型,需要提供哈希函数和相等性比较函数。int x, y;示例:可以定义一个结构体,并重载operator()来指定哈希函数。// 简单的哈希函数it!= us.end();++it) {

King_lxh的博客 3537

【C++:map和set的使用】C++STL容器详解:set容器从使用到高频算法题实战

1、set的声明如下,T就是set底层关键字的类型;2、set对T要求比较大小,默认要求T支持小于比较的就可以了,如果不支持或者想按自己的需求走可以自行实现仿函数传给第二个模版参数;3、set底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第三个参数——这一点不需要管;4、一般情况下,我们都不需要传后两个模版参数;5、set底层是用红黑树实现的,红黑树我们已经知道是平衡二叉树,增删查效率是O(logN) ,迭代器遍历是走的搜索树的中序,左根右,所以是有序的;

艾莉丝努力练剑的博客,感谢大家一直以来的对艾莉丝的支持和鼓励,uu们如果对C/C++方向感兴趣的话,可以通过艾莉丝主页的微信名片加艾莉丝的好友,和努力练剑的艾莉丝一起加油! 1262

C++——STL标准模板库——容器详解——set

set容器和multiset容器详解。第一次接触对组的概念。使用中要小心迭代过程中插入或者删除元素迭代器迭代器失效的可能性。

qq_42106610的博客 3130

C++ STL容器 —— set/multiset 用法详解

C++ STL容器 —— set/multiset 用法详解 写在前面:近期正在学习C++的STL容器,因此在这里做一下日志记录,主要介绍一些容器基本成员函数的用法, 配上实际用例,并不涉及原理。但别人的博客终究是别人的, 最好自己上手操作一下. 写的不好, 请大神手下留情. 下面说的 “运行之后” 表示: 运行上个语句之后的结果. 一行如果说的太长的话, 就得拖动下面的进度条才能看到后面的内...

Ember_Sky 1223

【C++ STL 容器】map 和 set 详解

①🐧map 和 set 的详细知识点;

Hou_lang_LJ的博客 549

详解c++STL—容器set/multiset

详解c++STL库—容器set/multiset

怀秋秋意的博客 2336

C++ STL Set容器详解:红黑树实现、核心特性与实战应用

在C++标准模板库中,关联式容器是管理有序数据集合的重要工具。其底层通常基于平衡二叉搜索树实现,通过自平衡机制确保操作效率。红黑树作为一种广泛使用的自平衡二叉搜索树,为容器提供了稳定的O(log n)时间复杂度,保证了元素的唯一性和自动排序。这种数据结构在需要动态维护有序唯一集合、频繁进行范围查询的场景中具有重要技术价值,例如实时排行榜、日程管理、游戏匹配系统等。本文以std::set为例,深入剖析其基于红黑树的实现原理,详解自动排序、元素唯一性、迭代器稳定性等核心特性,并通过实际代码演示如何高效进行增删改

weixin_30352191的博客 400

C++ STL---set关联容器详解

顺序容器包括vector、deque、list、forward_list、array、string,所有顺序容器都提供了快速顺序访问元素的能力。 关联容器包括set、map。 关联容器和顺序容器有着根本的不同:关联容器中的元素是按关键字来保存和访问的。与之相对,顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的。 关联容器不支持顺序容器的位置相关的操作。原因是关联容器中元素是根据关键字存储的,这些操作对关联容器没有意义。而且,关联容器也不支持构造函数或插入操作这些接受一个元素值和一个数量值得操作

HH_Bang的博客 694
上一篇: C语言:习题6-3 使用函数输出指定范围内的完数 (20分)
下一篇: C语言:习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
阳青
博客等级 码龄7年 51粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值