C++中set的用法

news/2024/12/5 12:05:28/

博主简介:Hello大家好呀,我是陈童学,一个与你一样正在慢慢前行的人。
博主主页:@陈童学哦
所属专栏:C++STL

在这里插入图片描述

前言:Hello各位小伙伴们好!欢迎来到本专栏C++STL的学习,本专栏旨在帮助大家了解并熟悉使用C++中的STL,C++中的STL(标准模板库)是相当好用的,🍉🍉🍉所以大家赶紧订阅一起学起来叭!那么话不多说接下来就进入本文C++中set的学习。

📢📢📢站点

  • ⭐一、set的简介
  • ⭐二、set的定义及初始化
  • ⭐三、set中常用的成员函数
  • ⭐四、set的遍历
  • ⭐五、set的真题巩固
  • ⭐六、写在最后

⭐一、set的简介

set的中文译为集合,知名见其意,因此set容器也就具有集合的属性啦!而集合这个概念大家应该上数学课应该都是学过的哈,集合它具有确定性、互异性、无序性。当然我们这里重点记住它的互异性就OK了,那么什么是互异性呢?就是说一个集合里边是不会出现两个甚至以上相同的元素的(有我没他,有他没我),说明集合还是比较专一的哈,大家以后对待感情也要专一哦!😉😉😉

  • 还有非常重要的一点就是set容器会自动地对元素进行升序排序(从小到大)

使用set时需要包含头文件:

#include<set>

⭐二、set的定义及初始化

  • 定义
    set<数据类型>变量名
    例:
//set的定义 
set<int> s1; //定义一个储存数据类型为int的set容器s1 
set<double> s2; //定义一个储存数据类型为double的set容器s2 
set<string> s3; //定义一个储存数据类型为string的set容器s3
set<int> s4[N]; //定义一个储存数据类型为int的set数组,N为大小
set<double> s5[N]; //定义一个储存数据类型为double的set数组,N为大小

⭐三、set中常用的成员函数

set中的一些函数:

//常用函数 
insert()//插入元素
count()//判断容器中是否存在某个元素
size()//返回容器的大小,即元素的个数
erase()//删除集合中某个元素
clear()//清空集合
empty()//判断集合是否为空
begin()//返回第一个元素的迭代器
end()//返回最后一个元素+1的迭代器
rbegin()//返回最后一个元素的迭代器 
rend()//返回第一个元素的迭代器 //功能函数
find()//返回指定元素的迭代器
lower_bound()//返回第一个不小于指定值的元素的迭代器
get_allocator()//返回集合的分配器
swap()//交换两个集合的元素 
max_size()//返回集合能容纳元素个数的最大值 

⭐四、set的遍历

set的遍历一般有两种方法,接下来就让我们来看一下吧!

  • 一、通过迭代器iterator遍历
#include<iostream>
#include<set>
using namespace std;
int main()
{set<int> s1; //定义一个set容器 s1.insert(1); //插入元素 s1.insert(1);s1.insert(2);s1.insert(3);set<int>::iterator it; //定义迭代器it for(it=s1.begin();it!=s1.end();it++) //通过迭代器遍历输出 {cout<<*it<<" ";}
}

前面我们提到了set容器是会自动给我们升序排序的,所以我们遍历出来的结果是升序的,那么如果我们想降序遍历怎么搞呢?简单,可以从end开始回溯到begin嘛,或者我们通过逆迭代器来遍历

  • 1.从end回溯到begin
#include<iostream>
#include<set>
using namespace std;
int main()
{set<int> s2; //定义一个set容器 s2.insert(1); //插入元素 s2.insert(1);s2.insert(3);s2.insert(2);set<int>::iterator it;for(it=--s2.end();it!=--s2.begin();it--){cout<<*it<<" ";}	
}
  • 2.反向迭代器
#include<iostream>
#include<set>
using namespace std;
int main()
{set<int> s2; //定义一个set容器 s2.insert(1); //插入元素 s2.insert(1);s2.insert(3);s2.insert(2);set<int>::reverse_iterator it;  //定义反向迭代器 for(it=s2.rbegin();it!=s2.rend();it++)  //反向遍历输出 {cout<<*it<<" ";}}
  • 二、通过foreach遍历
#include<iostream>
#include<set>
using namespace std;
int main()
{set<int> s2; //定义一个set容器 s2.insert(1); //插入元素 s2.insert(1);s2.insert(3);s2.insert(2);for(int it:s2) //遍历 {cout<<it<<" ";}}

这种遍历简单易记,但是无法实现降序遍历

⭐五、set的真题巩固

下面是PTA中团体程序设计天梯赛-练习集的一道L2二阶题目,代码不复杂,但是有点弯在里边,所以还是需要动下脑筋的哦

下方为题目链接!!!!!!!!

--------------------L2-014 列车调度--------------------
题目详情:
火车站的列车调度铁轨的结构如下图所示。
在这里插入图片描述
两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道。每趟列车从入口可以选择任意一条轨道进入,最后从出口离开。在图中有9趟列车,在入口处按照{8,4,2,5,3,9,1,6,7}的顺序排队等待进入。如果要求它们必须按序号递减的顺序从出口离开,则至少需要多少条平行铁轨用于调度?

输入格式:
输入第一行给出一个整数N (2 ≤ N ≤10^5 ),下一行给出从1到N的整数序号的一个重排列。数字间以空格分隔。

输出格式:
在一行中输出可以将输入的列车按序号递减的顺序调离所需要的最少的铁轨条数。

输入样例:
9
8 4 2 5 3 9 1 6 7
输出样例:
4

AC代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{int n;cin>>n;set<int>st;st.insert(-1);for(int i=1;i<=n;i++){int x;cin>>x;if(x<*(st.rbegin()))st.erase(*(st.upper_bound(x)));st.insert(x);}cout<<st.size()-1;
}

如果实在没有理解题目的小伙伴可以看看下面这篇有关这题详解的文章哦!
🏆嘿,我是题目链接我在这儿呢!直接点击我就好啦!🏆

⭐六、写在最后

OK本文的学习就到此结束啦,希望本文可以帮助到各位有需要的小伙伴们喔,也希望各位小伙伴们不要吝惜手里的三连哦!❤️❤️❤️

💕 回头看,轻舟已过万重山,向前看,前路漫漫亦漫漫。

🍁🍁🍁那么我们下期再见!拜拜ヾ(•ω•`)o
在这里插入图片描述


http://www.ppmy.cn/news/145098.html

相关文章

windows驱动开发8:虚拟摄像头方案

一、摄像头框架 在业务场景中&#xff0c;有许多是需要应用能够通过摄像头的方式来访问相关的音视频数据&#xff0c;比如美颜、摄像头多路复用、IP摄像头接入视频会议等。这些功能通过虚拟摄像头的方式来实现&#xff0c;是一个比较通用的解决方案。那么如何及选用哪种技术方案…

wince摄像头驱动

要在嵌入式系统下使用摄像头&#xff0c;以前都是在winxp系统下用BCB写软件。换了个新公司&#xff0c;要在嵌入式系统下开始图像处理了。以前没接触过嵌入式&#xff0c;更别说在嵌入式下进行图像处理了。现在就从头开始吧&#xff0c;第一步就遇到难题了&#xff0c;很多摄像…

摄像头驱动问题(TQ2440)

电子市场买的摄像头《好朋友》&#xff0c;说实话没听说过这个品牌。 插到我的ubuntu 10.04上,通过cheese 可以用 插到我的板子上就有问题了&#xff1a; 首先&#xff1a;设备描述符没有 /dev/video0&#xff0c;只有这个设备&#xff0c;不是我的&#xff0c; cat /dev/v…

wince摄像头驱动帖子集锦

http://www.wince.com.tw/bbs/index.asp 请问kshuang大侠及各位高手 &#xff0c;用IssueIsochTransfer函数实现usb摄像头得驱动时&#xff0c;参数dwStartingFrame 是怎么设定得&#xff1f;还有实现一般得usb摄像头得功能&#xff0c;需要实现哪些类指定得功能呢&#xff08;…

USB摄像头驱动分析

1.构造一个usb_driver 2.设置 probe&#xff1a;2.1.分配video_device:video_device_alloc2.2 设置.fops.ioctl_ops (里面需要设置11项)如果要用内核提供 的缓冲区操作函数&#xff0c;还需要构造一个videobuf_queue_ops2.3.注册: video_register_device id_table:表示支持哪些…

驱动调试-摄像头部分

调试 1.硬件部分 根据原理图确定camera的接口是MIPI还是DVP,确定在哪路IIC上 如果是MIPI&#xff0c;确定MIPI的的data lane数&#xff0c;哪路CSI上 用万用表确定Camera的供电是否正常&#xff0c;是否需要软件控制 AVDD:camera模拟电压,给芯片的模拟器件供电---->2.8V&…

vue 3 第二十六章:样式(scoped、深度选择器、全局选择器、css modules、自定义注入名称、css中v-bind)

文章目录 1. 介绍2. 基本使用3. scoped原理4. 深度选择器5. 插槽选择器6. 全局选择器7. 混合使用局部与全局样式8. CSS Modules9. 自定义注入名称10. CSS 中的 v-bind() 1. 介绍 在 Vue 中&#xff0c;我们可以使用 scoped 特性来给组件的样式添加作用域。通过为组件的 <st…

第六十一天学习记录:C语言进阶:C语言预处理1

程序的翻译环境和执行环境 在ANSI C的任何一种实现中&#xff0c;存在两个不同的环境。 第一种是翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令。第2种是执行环境&#xff0c;它用于实际执行代码。 详解编译链接 翻译环境 ![在这里插入图片描述](https:/…