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

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容器区别:

  1. set容器不允许容器中有重复的元素。
  2. multiset容器允许容器中有重复的元素。

1.2 构造和赋值

① 功能描述:创建set容器以及赋值。

② 构造函数:

  1. set st; //默认构造函数
  2. set(const set &st); //拷贝构造函数

③ 赋值函数:

  1. 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容器。

② 函数原型:

  1. size(); //返回容器中元素的数目。
  2. empty(); //判断容器是否为空。
  3. 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容器进行插入数据和删除数据。

② 函数原型:

  1. insert(elem); //在容器中插入元素。
  2. clear(); //清除所有元素。
  3. erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
  4. erase(beg,end); //删除区间[beg,end)的所有元素,返回下一个元素的迭代器。
  5. 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容器进行查找书籍以及统计数据。

② 函数原型:

  1. find(key); //查找key是否存在,若存在,返回该键的元素的迭代器,若不存在,返回set.end();
  2. 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区别:

  1. set不可以插入重复数据,而multiset可以。
  2. set插入数据的同时会返回插入结果,表示插入是否成功。
  3. 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&#xff08;缩写 JWT&#xff09;是目前最流行的跨域认证解决方案。 传统的session认证 http协议本身是一种无状态的协议&#xff0c;而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证&#xff0c;那么下一次请求时&#xff0c;用户还要再一…...

Gradle7.4安装

前置&#xff1a;本文基于IntelliJ IDEA 2022.2.1 、jdk1.8进行安装 目录 1.挑选Gradle版本 2.系统变量设置 1.挑选Gradle版本 gradle兼容性差&#xff0c; 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库&#xff1f; Matplotlib是一个Python的数据可视化库&#xff0c;用于绘制各种类型的图表&#xff0c;包括线图、散点图、条形图、等高线图、3D图等等。它是一个非常强大和灵活的库&#xff0c;被广泛用于数据科学、机器学习、工程学、…...

学生党用什么蓝牙耳机比较好?300内高性价比蓝牙耳机排行

随着蓝牙技术的发展&#xff0c;蓝牙耳机越来越普及&#xff0c;不同价位、不同性能的蓝牙耳机数不胜数。那么&#xff0c;学生党用什么蓝牙耳机比较好&#xff1f;下面&#xff0c;我来给大家推荐几款三百内高性价比蓝牙耳机&#xff0c;一起来看看吧。 一、南卡小音舱蓝牙耳…...

Lambda 表达式与函数式接口

函数式接口 如果一个接口&#xff0c;只有一个抽象方法&#xff0c;该接口即为函数式接口。函数式接口&#xff0c;即可使用 Lambda 表达式。 如下面的接口 public interface Translate {void translate();}目前该接口的抽象方法为无参数无返回值 Lambda 表达式 无参无返回值…...

后端代码规范

1、报文入参尽量避免使用实体类&#xff08;如果用实体类接受参数&#xff0c;一定要写好注解&#xff0c;具体用到了实体类的哪一个属性&#xff09; /*** * Description: 新增玉米观测记录主表信息* param param params* param return 参数* return Result 返回类型* author…...

web自动化测试:Selenium+Python基础方法封装(建议收藏)

01、目的 web自动化测试作为软件自动化测试领域中绕不过去的一个“香饽饽”&#xff0c;通常都会作为广大测试从业者的首选学习对象&#xff0c;相较于C/S架构的自动化来说&#xff0c;B/S有着其无法忽视的诸多优势&#xff0c;从行业发展趋、研发模式特点、测试工具支持&…...

while实现1到100相加求和-课后程序(JavaScript前端开发案例教程-黑马程序员编著-第2章-课后作业)

【案例2-7】while实现1到100相加求和 一、案例描述 考核知识点 while循环语句 练习目标 掌握while循环语句。 需求分析 1-100之间的数相加求和&#xff0c;本案例通过while循环语句来实现。 案例分析 效果如图2-10所示。1-100所有数的和 具体实现步骤如下&#xff1a; 在&l…...

Thingsboard(2.4 postgresql版)数据库表结构说明

本文描述的表结构是根据thingsboard2.4&#xff08;postgresql版&#xff09;数据库中整理出来的&#xff0c;不一定完整&#xff0c;后续有新的发现再补充文档。 一、数据库E-R关系 Thingsboard2.4社区版共22个表&#xff0c;主要包括实体信息表、关系信息表、字典表和系统配…...

IDS反病毒与APT的具体介绍

文章目录一&#xff0c;IDS1. 什么是IDS&#xff1f;2. IDS和防火墙有什么不同&#xff1f;3. IDS工作原理&#xff1f;4. IDS的主要检测方法有哪些详细说明&#xff1f;5. IDS的部署方式有哪些&#xff1f;6. IDS的签名是什么意思&#xff1f;签名过滤器有什么作用&#xff1f…...

while do..while验证用户名和密码-课后程序(JavaScript前端开发案例教程-黑马程序员编著-第2章-课后作业)

【案例2-8】while do..while验证用户名和密码 一、案例描述 考核知识点 while、do…while循环语句 练习目标 掌握while语句。do…while循环语句。 需求分析 在网站上登录时会用到表单&#xff0c;让用户属于用户名和密码&#xff0c;输入正确才可以进入&#xff0c;本案例将…...

tmux常用操作指令

创建会话tmux new -s 会话名 恢复会话tmux at -t 会话名 tmux attach -t 会话名 杀死会话tmux kill-session -t 编号 tmux kill-session -t 会话名 查询会话tmux ls tmux list-session 划分窗格划分上下两个窗格&#xff1a; tmux split-window 划分左右两个窗格&#xff1a;…...

【Linux】线程安全

线程安全&#xff1a;在多线程运行的时候&#xff0c;不论线程的调度顺序怎样&#xff0c;最终的结果都是 一样的、正确的&#xff0c;这个线程就是安全的。 保证线程安全的要求&#xff1a; 1. 对线程同步&#xff0c;保证同一时刻只有一个线程访问临界资源。 2.在多线程中使用…...

Redis-mysql 缓存实战

本文基于Springboot&#xff0c;mybatis plus&#xff0c;mysql&#xff0c;redis&#xff0c; Jedis模拟redis缓存实现 目录 1. 添加所需maven依赖 2. 设置数据库及数据表 3. 构建实体类 4. 构建工具类实现 redis 数据库连接池&#xff0c;redis 的读取&#xff0c;写入功…...

蓝桥杯:通电

蓝桥杯&#xff1a; 通电https://www.lanqiao.cn/problems/162/learning/ 目录 题目描述 输入描述 输出描述 输入输出样例 输入 输出 题目分析(最小生成树)&#xff1a; AC代码(Java) 题目描述 2015 年&#xff0c;全中国实现了户户通电。作为一名电力建设者&#xff0…...

一文搞懂 Kubernetes 的 Limits 和 Requests

当在Kubernetes中使用容器时&#xff0c;重要的是要知道所涉及的资源是什么以及如何需要它们。有些进程比其他进程需要更多的CPU或内存。有些是关键的&#xff0c;不应该被饿死。知道了这一点&#xff0c;我们应该正确配置我们的容器和Pod&#xff0c;以获得两者的最佳效果。在…...

【C++】手撕红黑树

文章目录前言一、红黑树的概念二、红黑树的节点结构三、红黑树的插入四、红黑树的调整1、叔叔存在且为红2、叔叔不存在或存在且为黑3、插入完整代码4、总结五、红黑树的验证六、红黑树的删除七、红黑树与 AVL 树的比较八、红黑树的代码实现前言 在网络上流传着这样一张图片&am…...

Java中的CAS实现原理

文章目录一、什么是CAS&#xff1f;二、JAVA中如何实现CAS操作三、CAS在JUC中的运用四、ABA问题一、什么是CAS&#xff1f; 在计算机科学中&#xff0c;比较和交换&#xff08;Conmpare And Swap&#xff09;是用于实现多线程同步的原子指令。 它将内存位置的内容与给定值进行…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...