当前位置: 首页 > 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;是用于实现多线程同步的原子指令。 它将内存位置的内容与给定值进行…...

什么是华为云对象存储OBS?它有什么优势?

华为对象存储OBS&#xff08;Object Storage Service&#xff09;是一种高可用、高可靠、高性能的云存储服务&#xff0c;能够为企业和个人用户提供强大的数据存储和管理功能。本文将对华为对象存储OBS的特点、优势和未来发展进行详细介绍。 一、华为对象存储OBS的特点 1.对象…...

你知道照片怎么变清晰吗?增强照片清晰度的方法

相信很多小伙伴都会有这种的经历&#xff0c;去游玩时高高兴兴的拍照留念&#xff0c;结果拍出来的照片不是很尽人意。或者是画面还没聚焦好&#xff0c;就按下快门&#xff0c;导致拍摄出来的照片变模糊了。很多小伙伴遇到这种情况都很烦恼&#xff0c;照片丢了可惜&#xff0…...

NOIP模拟赛 轰炸(bomb)

题目描述 有nnn座城市&#xff0c;城市之间建立了mmm条有向的地下通道。 你需要发起若干轮轰炸&#xff0c;每轮可以轰炸任意多的城市。但在每次轰炸城市中&#xff0c;不能同时存在两个城市i,ji,ji,j满足可以通过地下通道从城市iii到达城市jjj。你需要求出最少需要多少轮可以…...

Linux系统之安装PHP环境

Linux系统之安装PHP环境 一、PHP介绍1.PHP简介2.PHP优势3.php7版本特点二、本地环境介绍1.环境规划2.检查操作系统版本3.检查当前yum仓库三、安装PHP5.4版本1.查看可安装php版本2.使用yum安装php3.安装httpd服务4.关闭selinux和设置防火墙5.编辑index.php测试文件6.测试php环境…...

MySQL8的安装教程

MySQL8的安装教程 1.安装包的下载 如果不想去官网下载的话可以去百度网盘进行下载。 MySQL :: Download MySQL Community Server mysql-8.0.28-winx64.zip_免费高速下载|百度网盘-分享无限制 (baidu.com) 提取码&#xff1a;0001 2.解压 3.创建一个my.ini的文件 最好是创建…...

日入500+的程序员都在用的“接私活”平台

网上总说程序员的薪资很高&#xff0c;这我可就不同意了&#xff1a; 程序员的薪资哪里是很高&#xff0c;而是非常高&#xff01;而会接私活的程序员更是能拿到更高的收入&#xff01;作为一个程序员&#xff0c;这些接私活的网站一定要收藏起来&#xff0c;让你在“八小时外…...

MySQL表设计思路(一对多、多对多...)

要开始单独负责需求了&#xff0c;捋一捋表设计的思路。 文章目录一、MySQL中的数据类型二、一对一的关系设计二、一对多的关系设计三、多对多的关系设计四、经验总结一、MySQL中的数据类型 字符串类型 varchar&#xff1a;即variable char &#xff0c;可边长度的字符串&#…...

内存对齐:C/C++编程中的重要性和技巧

C/C中的内存对齐前言基本概念 什么是内存对齐&#xff1f;内存对齐的定义内存对齐的作用数据类型的大小ARM 64 位架构和 x86_64 架构下的数据类型大小ARM 32 位架构下的数据类型大小内存对齐的边界填充字节的作用内存对齐的原理结构体中的内存对齐结构体的定义和使用结构体中成…...

C++ Primer第五版_第七章习题答案(41~50)

文章目录练习7.411、头文件2、源文件3、主函数练习7.42练习7.43练习7.44练习7.45练习7.46练习7.47练习7.48练习7.49练习7.50练习7.41 使用委托构造函数重新编写你的Sales_data 类&#xff0c;给每个构造函数体添加一条语句&#xff0c;令其一旦执行就打印一条信息。用各种可能的…...

python玄阶斗技--NumPy入门

目录 一.NumPy介绍 二.创建数组 1.一维数组创建 2.二维数组创建 3.zeros函数 4.ones函数 5.empty函数 6.arange函数 三.NumPy的数学操作 1.基本运算 2.矩阵运算 3.ndarray类的方法 四.数组堆叠 五.数组分隔 一.NumPy介绍 在这里对NumPy的介绍我不想扯太多&#xf…...