当前位置:   article > 正文

c++ set用法 入门必看 超详细

c++ set

1、set的作用
set就是集合的意思,集合的特点就是不会出现重复的内容。一般用来作查重或去重操作,举个场景,给出一个表:

姓名爱好
小明打篮球
小刚画画
小明听音乐
问该表中出现了多少个人,学会了set,就可以很轻松地解决这个问题

2、set的定义
set<储存的类型> 容器名
如:
储存int型的值 set<int> s;
储存double型的值 set<double> s;
储存string型的值 set<string> s;
储存结构体或者类的值的值 set<结构体名> s;

(1)set的一些基本的成员函数

//常用函数(必学)
insert()//插入元素
count()//判断容器中是否存在某个元素
size()//返回容器的尺寸,也可以元素的个数
erase()//删除集合中某个元素
clear()//清空集合
empty()//判断是否为空
begin()//返回第一个节点的迭代器
end()//返回最后一个节点加1的迭代器
rbegin()//反向迭代器
rend()//反向迭代器

//功能函数(进阶)
find()//查找某个指定元素的迭代器
lower_bound()//二分查找第一个不小于某个值的元素的迭代器
get_allocator()//返回集合的分配器
swap()//交换两个集合的变量
max_size()//返回集合能容纳元素的最大限值
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

代码:

#include<iostream>//c++标准头文件,可以使用cout,cin等标准编译用法
#include<set>//使用set需要带上这个文件
using namespace std;//命名空间,防止重名给程序带来各种隐患,使用cin,cout,map,set,vector,queue时都要使用
int main(){
	set<int> s;//定义 
	s.insert(1);//插入元素1 
	s.insert(3);//插入元素3
	s.insert(2);//插入元素2
	cout<<"现有的元素有"<<endl; 
	for(int c:s){//遍历set,注意set会将元素自动排序,插入的顺序是1、3、2,遍历的顺序是1、2、3 
		cout<<c<<' ';
	} 
	cout<<endl;
	cout<<endl;
	s.erase(3);//删除元素3
	
	cout<<"删除元素3后,现有的元素有"<<endl; 
	for(int c:s){//遍历set,注意set会将元素自动排序,插入的顺序是1、3、2,遍历的顺序是1、2、3 
		cout<<c<<' ';
	} 
	cout<<endl;
	cout<<endl;
	
	cout<<"现在s.size()=="; 
	cout<<s.size();
	cout<<",即有两个元素" ;
	cout<<endl;
	cout<<endl;
	
	cout<<"是否包含元素2:"<<endl;
	cout<<"s.count(2)=="<<s.count(2)<<"即包含元素2"; 
	cout<<endl;
	cout<<endl;
	cout<<"是否包含元素3:"<<endl;
	cout<<"s.count(3)=="<<s.count(3)<<"即不包含元素3"; 
	cout<<endl;
	cout<<endl;
	
	cout<<"s是否是空的:"<<endl;
	cout<<"s.empty()=="<<s.empty()<<"即s不为空"; 
	cout<<endl;
	cout<<endl;
	
	s.clear();//清空集合 
	
	cout<<"s是否是空的:"<<endl;
	cout<<"s.empty()=="<<s.empty()<<"即s是空的"; 
	cout<<endl;
	cout<<endl;
	
	
	cout<<"s是否是空的:"<<endl;
	cout<<"s.size()=="<<s.size()<<"即s是空的"; //s.size()==0也可以判断集合是否为空,为了考虑代码可读性,一般不用size()代替empty() 
	cout<<endl;
	cout<<endl;
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56

运行结果:

现有的元素有
1 2 3

删除元素3后,现有的元素有
1 2

现在s.size()==2,即有两个元素

是否包含元素2:
s.count(2)==1即包含元素2

是否包含元素3:
s.count(3)==0即不包含元素3

s是否是空的:
s.empty()==0即s不为空

s是否是空的:
s.empty()==1即s是空的

s是否是空的:
s.size()==0即s是空的
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

3、set的两种遍历方法

(1)迭代器iterator
代码:

#include<iostream>
#include<set>
using namespace std;
int main(){
	set<int> s;//定义 
	s.insert(1);//插入元素1 
	s.insert(3);//插入元素3
	s.insert(2);//插入元素2
	set<int>::iterator it;//使用迭代器
	for(it=s.begin();it!=s.end();it++){
		cout<<*it<<' ';
	} 
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

运行结果:

1 2 3
  • 1

set有一个很重要的特性,那就是自动升序排序,在很多场景可以方便使用,那么当需要降序排序的时候需要怎样呢?
1、逆向思维
从end()-1到begin()遍历就是降序的了

#include<iostream>
#include<set>
using namespace std;
int main(){
	set<int> s;//定义 
	s.insert(1);//插入元素1 
	s.insert(3);//插入元素3
	s.insert(2);//插入元素2
	set<int>::iterator it;//使用迭代器
	for(it=--s.end();it!=--s.begin();it--){
		cout<<*it<<' ';
	} 
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

运行结果:

3 2 1
  • 1

2、rbegin()和rend()
逆向迭代器本来就是实现逆向迭代的功能的,下面看用法

#include<iostream>
#include<set>
using namespace std;
int main(){
	set<int> s;//定义 
	s.insert(1);//插入元素1 
	s.insert(3);//插入元素3
	s.insert(2);//插入元素2
	set<int>::reverse_iterator it;//使用反向迭代器
	for(it=s.rbegin();it!=s.rend();it++){
		cout<<*it<<' ';
	} 
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

运行结果:

3 2 1
  • 1

(2)foreach遍历

#include<iostream>
#include<set>
using namespace std;
int main(){
	set<int> s;//定义 
	s.insert(1);//插入元素1 
	s.insert(3);//插入元素3
	s.insert(2);//插入元素2
	for(auto it:s){
		cout<<it<<' ';
	} 
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

运行结果:

1 2 3
  • 1

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

课外知识
auto用法,c++auto用法强大,当你无法确定变量的类型时,都可以用auto来代替,迭代器iterator很难记住,其实可以用auto来代替:

#include<iostream>
#include<set>
using namespace std;
int main(){
	set<int> s;//定义 
	s.insert(1);//插入元素1 
	s.insert(3);//插入元素3
	s.insert(2);//插入元素2
	for(auto it=s.begin();it!=s.end();it++){
		cout<<*it<<' ';
	} 
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

运行结果:

1 2 3
  • 1

是不是很简单呢?

刚接触肯定会觉得难,多些做题多些用,熟悉了就容易了,兄弟萌,加油!!!

文章尚有不足,欢迎大牛们指正

感谢观看,点个赞吧

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/778057
推荐阅读
相关标签
  

闽ICP备14008679号