当前位置: 首页 > news >正文

C++ 标准模板库(STL)之集合(set)

啊,哈喽,小伙伴们大家好。我是#张亿,今天呐,学的是集合(set)

C++ 标准模板库(STL)之集合(set)

(下面代码中的std::要去掉)

在C++标准模板库(STL)中,set 是一种非常有用的容器,用于存储唯一元素的集合。set 内部自动对元素进行排序,通常使用红黑树(Red-Black Tree)实现,以保证元素以升序排列,并且能快速地进行查找、插入和删除操作。下面将详细介绍 set 的基本用法和特性。

一、集合

定义:把一些元素按照某些规律放在一起,就形成了一个集合。比如说每个班级就是一个集合,竞赛班也是一个集合,每间学校也是一个集合,等等。

特点:确定性、互异性、无序性。

  1. 确定性 表示一个元素要么在这个集合内,要么不在。(这个很水很容易理解)
  2. 互异性 表示一个集合当中所有元素都是不一样的,不存在在一个集合中,出现两个一模一样的元素
  3. 无序性 表示一个集合当中的元素没有顺序,就像班级调座位一样,谁都可以坐前排,谁都可以坐后排,是平等地位的。

应用:在信息学当中,要用到集合,就可以使用set这个容器。

但是正如刚刚所说的,如果一个集合没有顺序,那么我们在遍历这个集合的时候存在着困难,因此,我们还是会按照顺序来整理元素(set会自动帮你排序和去重,从小到大),但是大家要注意了,这个和集合的特点本身并不冲突。就像是班级所有同学确实可以都有机会坐前排和后排,但班主任可能会出于某些考虑按照规则制定了座位表,这二者并不冲突。

二、set

set 翻译为集合,是一个内部自动有序且不含重复元素的容器。set 最主要的作用就是自动去重并按升序排序,因此遇到需要去重但是又不方便直接开数组的情况。set 中的元素是唯一的,其内部采用“红黑树”实现。

红黑树示意图如下:

三、set的用法

  1. 定义方法:使用 set 前,必须先添加 set 头文件,即 #include ,同时,必须要有“using namespacestd”。

定义一个 set 的方法如下:

set<typename> name;

其中,typename 可以是任何基本类型或者容器,name 是集合的名字。

也可以定义set数组,例如:set st[100];这样st[0]~st[99]中的每一个元素都是一个set容器。

  1. 访问方法:set只能通过迭代器访问。

先定义一个迭代器:set<typename>::iterator it; 然后使用“*it” 来访问 set 中的元素。

四、Set 常用的函数


a.insert(5); //在a集合里插入一个元素5a.size(); //获取集合的长度(即有几个数)a.clear(); //清空集合a中的所有元素a.empty(); //判断集合a是否为空a.begin(); //集合a的第一个位置a.end(); //集合a的最后一个元素的下一个位置,就没有的意思a.rbegin(); // 返回一个逆向迭代器,指向倒数第一个元素,即最后一个元素的位置。a.erase(it); //删除迭代器当前存着的集合a的元素a.find(x)      //在集合s中查找等于 x 的元素,并返回指向该指针的迭代器。若不存在,则返回 s.end() 。时间复杂度O(logn)O(logn)。a.count(x)     //返回集合 s 中等于 x 的元素个数,时间复杂度O(k+logn),其中 k 为元素 x 的个数。set<int > s;  //普通的定义(不允许元素重复)struct rec{...};  //先定义结构体
set <rec > s;  // 定义set,set的成员为结构体变量类型multiset<double > s;  //(允许集合中元素重复)set<int > ::iterator it ;  //定义集合类型的迭代器。s.begin(); // 指向集合中最小元素的迭代器。
s.end(); // 指向集合中最大元素的下一个位置的迭代器。s.insert(x); // 把一个元素 x 插入到集合 s 中,时间复杂度为O(logn)。set<int > :: iterator it; // it是一个迭代器s.erase(x) 从 s 中删除所有等于 x 的元素。

 

相关文章:

  • GO Fsnotify学习与使用
  • 前端必知必会-jQuery 遍历 - 后代
  • 音视频生态下Unity3D和虚幻引擎(Unreal Engine)的区别
  • Excel 获取某列不为空的值【INDEX函数 | SMALL函数或 LARGE函数 | ROW函数 | ISBLANK 函数】
  • Three.js动画与交互
  • win10文件共享设置 - 开启局域网文件共享 - “您没有权限访问,请与网络管理员联系请求访问权限”解决方案
  • 抖店电商怎么使用云账户解决资金提现?
  • 公网IP和内网IP比较
  • 第八章 实战:构建Tomcat镜像及发布
  • 测试用例的进阶二
  • 独立站如何批量查收录?常用的3个的方法及其具体操作步骤
  • 23款奔驰E300立标升级23P智能辅助驾驶案例分享
  • 爬虫技术深潜:探究 JsonPath 与 XPath 的语法海洋与实战岛屿
  • 力扣 最小覆盖子串
  • 数据集-目标检测系列-鲨鱼检测数据集 shark >> DataBall
  • SegmentFault for Android 3.0 发布
  • [iOS]Core Data浅析一 -- 启用Core Data
  • css布局,左右固定中间自适应实现
  • es6(二):字符串的扩展
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Laravel Mix运行时关于es2015报错解决方案
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • React Transition Group -- Transition 组件
  • vue 配置sass、scss全局变量
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 动态规划入门(以爬楼梯为例)
  • 构建二叉树进行数值数组的去重及优化
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 前端临床手札——文件上传
  • 前端面试总结(at, md)
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 微信开源mars源码分析1—上层samples分析
  • 我有几个粽子,和一个故事
  • 写给高年级小学生看的《Bash 指南》
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 中文输入法与React文本输入框的问题与解决方案
  • 06-01 点餐小程序前台界面搭建
  • 《码出高效》学习笔记与书中错误记录
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • 湖北分布式智能数据采集方法有哪些?
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • 我们雇佣了一只大猴子...
  • ​flutter 代码混淆
  • # windows 安装 mysql 显示 no packages found 解决方法
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (C语言)fread与fwrite详解
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (每日一问)基础知识:堆与栈的区别
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .NET CORE Aws S3 使用
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET Core中如何集成RabbitMQ