C++中set的用法

简介: ⭐一、set的简介set的中文译为集合,知名见其意,因此set容器也就具有集合的属性啦!而集合这个概念大家应该上数学课应该都是学过的哈,集合它具有确定性、互异性、无序性。当然我们这里重点记住它的互异性就OK了,那么什么是互异性呢?就是说一个集合里边是不会出现两个甚至以上相同的元素的(有我没他,有他没我),说明集合还是比较专一的哈,大家以后对待感情也要专一哦!😉😉😉还有非常重要的一点就是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二阶题目,代码不复杂,但是有点弯在里边,所以还是需要动下脑筋的哦

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

火车站的列车调度铁轨的结构如下图所示。

ec5f18fd66f64e46a4852c71c1bbdb24.png

两端分别是一条入口(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本文的学习就到此结束啦,希望本文可以帮助到各位有需要的小伙伴们喔,也希望各位小伙伴们不要吝惜手里的三连哦!❤️❤️❤️

相关文章
|
3月前
|
SQL XML Java
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
文章介绍了MyBatis中动态SQL的用法,包括if、choose、where、set和trim标签,以及foreach标签的详细使用。通过实际代码示例,展示了如何根据条件动态构建查询、更新和批量插入操作的SQL语句。
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
|
3月前
|
索引 Python
Pandas中的时间序列利器:set_index用法
Pandas中的时间序列利器:set_index用法
88 0
|
4月前
|
编译器 C++ 容器
【C++】String常见函数用法
【C++】String常见函数用法
|
5月前
|
存储 JSON 关系型数据库
mysql中find_in_set()函数用法详解及增强函数
总结而言,`FIND_IN_SET()`是MySQL中处理由逗号分隔的字符串列表的一种便捷方法,尤其适用于列表相对较短且不经常更改的场景。然而,对于更为复杂的需要高性能和可扩展性的数据库设计,它可能不是最优选择,应考虑使用更加正规化的数据库结构。
661 2
mysql中find_in_set()函数用法详解及增强函数
|
4月前
|
存储 程序员 编译器
c++学习笔记08 内存分区、new和delete的用法
C++内存管理的学习笔记08,介绍了内存分区的概念,包括代码区、全局区、堆区和栈区,以及如何在堆区使用`new`和`delete`进行内存分配和释放。
49 0
|
5月前
|
C++
C++ string中的函数和常用用法
C++ 中string中的函数和常用用法
45 4
|
5月前
|
C++ 容器
【C++】map和set封装
【C++】map和set封装
40 2
|
5月前
|
存储 C++ 容器
【C++】map和set深度讲解(下)
【C++】map和set深度讲解(下)
64 2
|
5月前
|
存储 自然语言处理 Java
【C++】map和set深度讲解(上)
【C++】map和set深度讲解(上)
48 2
|
5月前
|
存储 C++ 容器