C++ 21 set容器
目录
一、set容器
1.1 简介
1.2 构造和赋值
1.3 大小和交换
1.4 插入和删除
1.5 查找和统计
1.6 set和multiset区别
1.7 内置类型指定排序规则
1.8 自定义数据类型指定排序规则
一、set容器
1.1 简介
① set容器中所有元素在插入时自动被排序。
② set容器和multiset容器属于关联式容器,底层结构用二叉树实现。
③ set容器与multiset容器区别:
- set容器不允许容器中有重复的元素。
- multiset容器允许容器中有重复的元素。
1.2 构造和赋值
① 功能描述:创建set容器以及赋值。
② 构造函数:
- set st; //默认构造函数
- set(const set &st); //拷贝构造函数
③ 赋值函数:
- set& operator=(const set &st); //重载等号操作符
④ set容器插入数据时用insert。
⑤ set容器插入的数据会自动排序。
#include<iostream>
using namespace std;
#include <set>//set容器 构造和赋值void printset(const set<int>&L)
{for (set<int>::const_iterator it = L.begin(); it != L.end(); it++){cout << *it << " ";}cout << endl;
}bool myCopare(int v1, int v2)
{//降序 就让第一个数 大于第二个数为真return v1 > v2;}void test01()
{set<int>s1; //插入数据 只有insert方式s1.insert(10);s1.insert(40);s1.insert(30);s1.insert(20);s1.insert(30);//遍历容器//set容器特点:所有元素插入时候自动被排序//set容器不允许插入重复值printset(s1);//拷贝构造set<int>s2(s1);printset(s2);//赋值set<int>s3;s3 = s2;printset(s3);
}int main() {test01();system("pause");return 0;}
运行结果:10 20 30 40
10 20 30 40
10 20 30 40
请按任意键继续. . .
1.3 大小和交换
① 功能描述:统计set容器大小以及交换set容器。
② 函数原型:
- size(); //返回容器中元素的数目。
- empty(); //判断容器是否为空。
- swap(st); //交换两个集合容器
#include<iostream>
using namespace std;
#include <set>//set容器 大小和交换void printset(const set<int>&L)
{for (set<int>::const_iterator it = L.begin(); it != L.end(); it++){cout << *it << " ";}cout << endl;
}//大小
void test01()
{set<int>s1; //插入数据 只有insert方式s1.insert(10);s1.insert(40);s1.insert(30);s1.insert(20);s1.insert(30);printset(s1);//判断是否为空if (s1.empty()){cout << "s1为空" << endl;}else{cout << "s1不为空" << endl;cout << "s1的大小为:" << s1.size() << endl;}
}//交换
void test02()
{set<int>s1;//插入数据 只有insert方式s1.insert(10);s1.insert(40);s1.insert(30);s1.insert(20);s1.insert(30);set<int>s2;//插入数据 只有insert方式s2.insert(100);s2.insert(400);s2.insert(300);s2.insert(200);s2.insert(300);cout << "交换前:" << endl;printset(s1);printset(s2);cout << "交换后:" << endl;s1.swap(s2);printset(s1);printset(s2);
}int main() {test01();test02();system("pause");return 0;}
运行结果:10 20 30 40
s1不为空
s1的大小为:4
交换前:
10 20 30 40
100 200 300 400
交换后:
100 200 300 400
10 20 30 40
请按任意键继续. . .
1.4 插入和删除
① 功能描述:set容器进行插入数据和删除数据。
② 函数原型:
- insert(elem); //在容器中插入元素。
- clear(); //清除所有元素。
- erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
- erase(beg,end); //删除区间[beg,end)的所有元素,返回下一个元素的迭代器。
- erase(elem); //删除容器中值为elem的元素。
#include<iostream>
using namespace std;
#include <set>//set容器 插入和删除void printset(const set<int>&L)
{for (set<int>::const_iterator it = L.begin(); it != L.end(); it++){cout << *it << " ";}cout << endl;
}void test01()
{set<int>s1; //插入数据 只有insert方式s1.insert(20);s1.insert(40);s1.insert(30);s1.insert(10);s1.insert(30);printset(s1);//删除s1.erase(s1.begin()); //删掉的是排序后的第一个元素10printset(s1);//删除函数的重载版本s1.erase(30); //删除30这个元素printset(s1);//清空方式一:s1.erase(s1.begin(), s1.end());printset(s1);//清空方式二:s1.clear();printset(s1);
}int main()
{test01();system("pause");return 0;
}
运行结果:10 20 30 40
20 30 40
20 40
请按任意键继续. . .
1.5 查找和统计
① 功能描述:对set容器进行查找书籍以及统计数据。
② 函数原型:
- find(key); //查找key是否存在,若存在,返回该键的元素的迭代器,若不存在,返回set.end();
- cout(key); //统计key的元素个数。
#include<iostream>
using namespace std;
#include <set>//set容器 查找和统计void printset(const set<int>&L)
{for (set<int>::const_iterator it = L.begin(); it != L.end(); it++){cout << *it << " ";}cout << endl;
}void test01()
{set<int>s1; //插入数据 只有insert方式s1.insert(20);s1.insert(40);s1.insert(30);s1.insert(10);s1.insert(30);printset(s1);//查找返回的是一个迭代器set<int>::iterator pos = s1.find(30); if (pos != s1.end()){cout << "找到元素:" << *pos << endl;}else{cout << "未找到元素" << endl;}
}//统计
void test02()
{set<int>s1;//插入数据 只有insert方式s1.insert(20);s1.insert(40);s1.insert(30);s1.insert(10);s1.insert(30);int num = s1.count(30);//对于set而言 统计结果要么是0 要么是1cout << "num = " << num << endl;
}int main() {test01();test02();system("pause");return 0;}
运行结果:10 20 30 40
找到元素:30
num = 1
请按任意键继续. . .
1.6 set和multiset区别
① set和multiset区别:
- set不可以插入重复数据,而multiset可以。
- set插入数据的同时会返回插入结果,表示插入是否成功。
- mutiset不会检测数据,因此可以插入重复数据。
② 如果不允许插入重复数据可以利用set
③ 如果需要插入重复数据利用mutiset
#include<iostream>
using namespace std;
#include <set>//set容器 和 mutiset容器 的区别void printset(const set<int>&L)
{for (set<int>::const_iterator it = L.begin(); it != L.end(); it++){cout << *it << " ";}cout << endl;
}void test01()
{set<int>s1; pair<set<int>::iterator, bool> ret = s1.insert(10); //s.insert(数)返回的是pair类型,第一个数为迭代器,第二个数为布尔类型if (ret.second){cout << "第一次插入成功" << endl;}else{cout << "第一次插入失败" << endl;}ret = s1.insert(10); //set不允许插入重复的值,当插入重复的值,返回的第二个参数为False,然后不会插入进去if (ret.second){cout << "第二次插入成功" << endl;}else{cout << "第二次插入失败" << endl;}multiset<int>ms;//运行插入重复值ms.insert(10);ms.insert(10);ms.insert(10);for (multiset<int>::const_iterator it = ms.begin(); it != ms.end(); it++){cout << *it << " ";}cout << endl;
}int main()
{test01();system("pause");return 0;
}
运行结果:第一次插入成功
第二次插入失败
10 10 10
请按任意键继续. .
1.7 内置类型指定排序规则
① set容器默认排序规则从小到大,利用仿函数,可以改变排序规则。
#include<iostream>
using namespace std;
#include <set>//set容器排序class MyCompare
{
public:bool operator()(int v1, int v2)const //第一个()表示重载符号,第二个()为参数列表{return v1 > v2;}
};void test01()
{set<int>s1; //set容器默认从小到大排序s1.insert(10);s1.insert(40);s1.insert(50);s1.insert(20);s1.insert(30);for (set<int>::iterator it = s1.begin(); it != s1.end(); it++){cout << *it << " ";}cout << endl;//指定排序规则为从大到小set<int, MyCompare>s2; //此时指定set容器的排序规则为MyCompare,MyCompare()s2.insert(10);s2.insert(40);s2.insert(50);s2.insert(20);s2.insert(30);for (set<int, MyCompare>::iterator it = s2.begin(); it != s2.end(); it++){cout << *it << " ";}cout << endl;
}int main()
{test01();system("pause");return 0;
}
运行结果:10 20 30 40 50
50 40 30 20 10
请按任意键继续. . .
1.8 自定义数据类型指定排序规则
#include<iostream>
using namespace std;
#include <set>//set容器排序class Person
{
public:Person(string name, int age){this->m_Name = name;this->m_Age = age;}string m_Name;int m_Age;
};class comparePerson //仿函数本质是一个类
{
public:bool operator()(const Person& p1, const Person& p2)const{//安装年龄 降序return p1.m_Age > p2.m_Age;}
};void test01()
{//自定义数据类型 都会指定排序规则set<Person, comparePerson>s1;//创建Person对象Person p1("刘备", 24);Person p2("关羽", 28);Person p3("张飞", 25);Person p4("赵云", 21);s1.insert(p1);s1.insert(p2);s1.insert(p3);s1.insert(p4);for (set<Person, comparePerson>::iterator it = s1.begin(); it != s1.end(); it++){cout << "姓名:" << it->m_Name << "年龄:" << it->m_Age << endl;}
}int main()
{test01();system("pause");return 0;
}
运行结果:姓名:关羽年龄:28
姓名:张飞年龄:25
姓名:刘备年龄:24
姓名:赵云年龄:21
请按任意键继续. . .
相关文章:
C++ 21 set容器
目录 一、set容器 1.1 简介 1.2 构造和赋值 1.3 大小和交换 1.4 插入和删除 1.5 查找和统计 1.6 set和multiset区别 1.7 内置类型指定排序规则 1.8 自定义数据类型指定排序规则 一、set容器 1.1 简介 ① set容器中所有元素在插入时自动被排序。 ② set容器和multise…...
什么是JWT
JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案。 传统的session认证 http协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再一…...
Gradle7.4安装
前置:本文基于IntelliJ IDEA 2022.2.1 、jdk1.8进行安装 目录 1.挑选Gradle版本 2.系统变量设置 1.挑选Gradle版本 gradle兼容性差, 1.跟idea会有版本问题。 2.跟springboot也有兼容问题Spring Boot Gradle Plugin Reference Guide 首先查询版本&…...
【华为OD机试 2023最新 】 箱子之字形摆放(C++ 100%)
文章目录 题目描述输入描述输出描述备注用例题目解析C++题目描述 有一批箱子(形式为字符串,设为str), 要求将这批箱子按从上到下以之字形的顺序摆放在宽度为 n 的空地,请输出箱子的摆放位置。 例如:箱子ABCDEFG,空地宽度为3,摆放结果如图: 则输出结果为: AFG BE CD …...
Matplotlib库入门
Matplotlib库的介绍 什么是Matplotlib库? Matplotlib是一个Python的数据可视化库,用于绘制各种类型的图表,包括线图、散点图、条形图、等高线图、3D图等等。它是一个非常强大和灵活的库,被广泛用于数据科学、机器学习、工程学、…...
学生党用什么蓝牙耳机比较好?300内高性价比蓝牙耳机排行
随着蓝牙技术的发展,蓝牙耳机越来越普及,不同价位、不同性能的蓝牙耳机数不胜数。那么,学生党用什么蓝牙耳机比较好?下面,我来给大家推荐几款三百内高性价比蓝牙耳机,一起来看看吧。 一、南卡小音舱蓝牙耳…...
Lambda 表达式与函数式接口
函数式接口 如果一个接口,只有一个抽象方法,该接口即为函数式接口。函数式接口,即可使用 Lambda 表达式。 如下面的接口 public interface Translate {void translate();}目前该接口的抽象方法为无参数无返回值 Lambda 表达式 无参无返回值…...
后端代码规范
1、报文入参尽量避免使用实体类(如果用实体类接受参数,一定要写好注解,具体用到了实体类的哪一个属性) /*** * Description: 新增玉米观测记录主表信息* param param params* param return 参数* return Result 返回类型* author…...
web自动化测试:Selenium+Python基础方法封装(建议收藏)
01、目的 web自动化测试作为软件自动化测试领域中绕不过去的一个“香饽饽”,通常都会作为广大测试从业者的首选学习对象,相较于C/S架构的自动化来说,B/S有着其无法忽视的诸多优势,从行业发展趋、研发模式特点、测试工具支持&…...
while实现1到100相加求和-课后程序(JavaScript前端开发案例教程-黑马程序员编著-第2章-课后作业)
【案例2-7】while实现1到100相加求和 一、案例描述 考核知识点 while循环语句 练习目标 掌握while循环语句。 需求分析 1-100之间的数相加求和,本案例通过while循环语句来实现。 案例分析 效果如图2-10所示。1-100所有数的和 具体实现步骤如下: 在&l…...
Thingsboard(2.4 postgresql版)数据库表结构说明
本文描述的表结构是根据thingsboard2.4(postgresql版)数据库中整理出来的,不一定完整,后续有新的发现再补充文档。 一、数据库E-R关系 Thingsboard2.4社区版共22个表,主要包括实体信息表、关系信息表、字典表和系统配…...
IDS反病毒与APT的具体介绍
文章目录一,IDS1. 什么是IDS?2. IDS和防火墙有什么不同?3. IDS工作原理?4. IDS的主要检测方法有哪些详细说明?5. IDS的部署方式有哪些?6. IDS的签名是什么意思?签名过滤器有什么作用?…...
while do..while验证用户名和密码-课后程序(JavaScript前端开发案例教程-黑马程序员编著-第2章-课后作业)
【案例2-8】while do..while验证用户名和密码 一、案例描述 考核知识点 while、do…while循环语句 练习目标 掌握while语句。do…while循环语句。 需求分析 在网站上登录时会用到表单,让用户属于用户名和密码,输入正确才可以进入,本案例将…...
tmux常用操作指令
创建会话tmux new -s 会话名 恢复会话tmux at -t 会话名 tmux attach -t 会话名 杀死会话tmux kill-session -t 编号 tmux kill-session -t 会话名 查询会话tmux ls tmux list-session 划分窗格划分上下两个窗格: tmux split-window 划分左右两个窗格:…...
【Linux】线程安全
线程安全:在多线程运行的时候,不论线程的调度顺序怎样,最终的结果都是 一样的、正确的,这个线程就是安全的。 保证线程安全的要求: 1. 对线程同步,保证同一时刻只有一个线程访问临界资源。 2.在多线程中使用…...
Redis-mysql 缓存实战
本文基于Springboot,mybatis plus,mysql,redis, Jedis模拟redis缓存实现 目录 1. 添加所需maven依赖 2. 设置数据库及数据表 3. 构建实体类 4. 构建工具类实现 redis 数据库连接池,redis 的读取,写入功…...
蓝桥杯:通电
蓝桥杯: 通电https://www.lanqiao.cn/problems/162/learning/ 目录 题目描述 输入描述 输出描述 输入输出样例 输入 输出 题目分析(最小生成树): AC代码(Java) 题目描述 2015 年,全中国实现了户户通电。作为一名电力建设者࿰…...
一文搞懂 Kubernetes 的 Limits 和 Requests
当在Kubernetes中使用容器时,重要的是要知道所涉及的资源是什么以及如何需要它们。有些进程比其他进程需要更多的CPU或内存。有些是关键的,不应该被饿死。知道了这一点,我们应该正确配置我们的容器和Pod,以获得两者的最佳效果。在…...
【C++】手撕红黑树
文章目录前言一、红黑树的概念二、红黑树的节点结构三、红黑树的插入四、红黑树的调整1、叔叔存在且为红2、叔叔不存在或存在且为黑3、插入完整代码4、总结五、红黑树的验证六、红黑树的删除七、红黑树与 AVL 树的比较八、红黑树的代码实现前言 在网络上流传着这样一张图片&am…...
Java中的CAS实现原理
文章目录一、什么是CAS?二、JAVA中如何实现CAS操作三、CAS在JUC中的运用四、ABA问题一、什么是CAS? 在计算机科学中,比较和交换(Conmpare And Swap)是用于实现多线程同步的原子指令。 它将内存位置的内容与给定值进行…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
