博主简介:
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