来学STL(2)<set>(初阶)使用(持续更新)

文章目录:

大vvvvvv

按需求抓重点。收藏起来
最后一次更新与32

vector容器

说明

本文注重讲解常用的方法,偏方容易把我搞的云里雾里。
原创文章,未经允许禁止转载

set容器的定义

所有元素都会根据元素的键值自动排序,set元素的键值就是实值,实值就是键值。set不允许两个元素有相同的键值。(set的元素不像map那样可以同时拥有实值(value)和键值(key))。(来自博客园)

换而言之,就是一种集合,这个容器里面不会出现重复的元素,而且自动给你排序。排序从小到大。

set容器的简单使用(原始代码)

如果不追求更多使用方法,只是简单了解,请阅读下面的代码和总结。
注:其中迭代器的用法可跳转《STL加餐–迭代器的使用(初阶)–持续更新

#include<iostream>
#include<set>
using namespace std;
int main(){
	set<int> s;
	//加入元素5 4 3 2 1
	for(int i = 5;i>=1;i--){
		s.insert(i);
	} 
	// 遍历set 
	set<int> :: iterator it ;  //申请一个set的迭代器 
	for(it = s.begin();it != s.end();++it){
		cout<<*it<<endl;
	}
	
	cout<<"s.size() = "<<s.size()<<endl; //输出set的大小 
	
	//再次加入元素1 2 3 4 5
	for(int i = 1;i<=5;i++){
		s.insert(i);
	} 
	
	cout<<"s.size() = "<<s.size()<<endl; //再次输入大小 
	return 0;
} 

运行结果

1
2
3
4
5
s.size() = 5
s.size() = 5

小解读 由上面代码我们可以看到set的两个功能:

1.set是一个无重复元素的集合,也就是会自动去除重复的元素。
2.set可以自动为我们排序,默认排序为升序。(高级的排序这里不做讲解)

set的常见使用函数

set的复杂度要比vector小,没有那么多的构造赋值什么的,所以直接将函数即可。

函数如下。

insert() 加入元素(插入元素)
size()     返回当前set容器中的元素个数
begin()    返回set容器的第一个元素
end()      返回set容器的最后一个元素
clear()    删除set容器中的所有的元素
empty()    判断set容器是否为空
count() 用来查找set中某个键值出现的次数
erase() 删除元素

小总结:
1.set加入元素不像vector一样可以像使用数组一样加入元素,最方便利用insert插入元素。
2.begin()和end()的用法和vector差不多,但是注意set里面的begin()和end()不支持‘+'和 ‘-’运算符(自增自减可以),申请的迭代器也不行,也就数说,出现下面代码会报错

s.begin() + 1;
s.begin() - 1;
s.end() - 1;
set<int> :: iterator ite = s.begin() + 2;
ite = ite + 2;
...等等相关操作

简单函数在原始代码中出现过,所以不做过多讲解。

count()函数

count()函数会返回某个键值(就是元素)出现的次数,由于set的去重特定,如果有某个元素,就只会返回1,如果没有,返回0。详情看代码(省略头文件)。

	s.insert(1);
	s.insert(2);
	s.insert(4);
	s.insert(3);
	s.insert(1);  //重复插入1
	cout<<"s.count(1) = "<<s.count(1)<<endl;  //查看1出现的次数
	cout<<"s.count(0) = "<<s.count(0)<<endl;  //查看0出现的次数 

运行结果

1
0

erase()的用法

erase()的三种常用原形

1.erase(iterator) ,删除定位器iterator指向的值(删除这个地址的元素)

2.erase(first,second),删除定位器first和second之间的值(删除地址从first到second的元素(注意不包括second地址的元素))

3.erase(key_value),删除键值key_value的值()

具体适用方法请看代码

	set<int> s;
	//加入元素10 9 8 7 6 5 4 3 2 1
	for(int i = 10;i>=1;i--){
		s.insert(i);
	}
	
	//申请一个迭代器 
	set<int> :: iterator it;
	
	
	//第一种删除
     s.erase(s.begin()); 		//删除第一个元素 1; 
     cout<<"第一次删除的结果为:"; 
      for(it = s.begin() ; it != s.end() ; ++it){
         cout<<*it<<' ';
     }
     cout<<endl;
     
     //第二种删除
      
     s.erase(s.begin(),++s.begin()); //在上面删除的基础上删去元素 2(因为不包括地址++s.begin()的元素,所有只能删掉一个元素) 
     cout<<"第二次删除的结果为:";
     fprintf("text.txt",)
      for(it = s.begin() ; it != s.end() ; ++it){
         cout<<*it<<' ';
     }
     cout<<endl;
     //第三种删除
     s.erase(5);					//删除集合里的 5  
      cout<<"第三次删除的结果为:";
     for(it = s.begin() ; it != s.end() ; ++it){
         cout<<*it<<' ';
     }
     cout<<endl;

运行结果:

第一次删除的结果为:2 3 4 5 6 7 8 9 10
第二次删除的结果为:3 4 5 6 7 8 9 10
第三次删除的结果为:3 4 6 7 8 9 10

持续更新…(如有问题欢迎指正)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

手撕键盘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值