set

set 是个集合,根据数学,不能有两个重复的值

在一个集合内,只能有其中一个,所以set 表现出唯一性 性质。在一题中,可以利用唯一性来解决问题.set容器里面的元素是按照递增的序列自动排序的。也可以将它改变为递减的序列。

set<int,greater<int>>mp;    //递减序列
set<int,less<int>>mp;       //递增序列 

下面来介绍一下它的用法:

数据的插入操作:

set<int>mp;
mp.insert(123);

也可以是对的形式出现,set<pair<string,int>>mp 的形式来储存两个成对的信息,对于成对的东西,排序按照的是第一个(左边)的东西,不是按照第二个来排的。(这个要记住)。

set<pair<int,string>>mp;
mp.insert(make_pair(5000,"apple"));
mp.insert(make_pair(200,"japan"));
mp.insert(make_pair(195,"china"));
for(auto it=mp.begin();it!=mp.end();it++)
	cout<<it->first<<' '<<it->second<<endl;

对于这个pair输出两个信息的时候,第一个是it->first  ,另一个是it->second ,与普通的迭代器不同。

set的搜索操作,用到 mp.find(),首先需要迭代器,如果 it=mp.find() 是末尾后面的迭代器的话,就没有找到,如果不是的话,就会找到。

set<int>mp;
mp.insert(159);
mp.insert(200);
mp.insert(1000);
mp.insert(12);
set<int>::iterator iter1=mp.begin();
iter1=mp.find(0);
if(iter1!=mp.end())
	cout<<"找到"<<' '<<*iter1<<endl;
else
	cout<<"没找到"<<endl; 

成对的搜索,与上面的单个信息的搜索是一样的,具体就不说了。看代码:

set<pair<int,string>>mp;
mp.insert(make_pair(5000,"apple"));
mp.insert(make_pair(200,"japan"));
mp.insert(make_pair(195,"china"));
for(auto it=mp.begin();it!=mp.end();it++)
	cout<<it->first<<' '<<it->second<<endl;
	//cout<<"..........."<<endl<<endl;
		
		
//成对搜索  	
set<pair<int,string>>::iterator iter=mp.begin();
iter=mp.find(make_pair(200,"japan")); 
    if(iter!=mp.end())
	cout<<iter->first<<' '<<iter->second ;

size 是里面元素的个数大小,empty 判断是否为空,count函数(元素出现的次数)用来判断某个元素是否存在。clear 清空容器里面所有的元素。 也有 rbegin()  rend() 反向迭代器 反向输出。

set 数据的删除: 一共有三种删除

1.按迭代器方式删除

mp.erase(mp.begin());

2.按具体的键值来删除

mp.erase(1000);

3.删除定位器之间的键值

set<int>::iterator iter1=mp.begin();
set<int>::iterator left=mp.begin();
set<int>::iterator right=mp.begin();
right++;
right++;
mp.erase(left,right);
for(auto it=mp.begin();it!=mp.end();it++)
	cout<<*it<<endl;

这个right 只能一个一个的加,不能一下加上2.

lower_bound 和upper_bound 函数的应用:

lower_bound()是第一个大于或等于该值的一个数。

upper_bound()是第一个大于该值的一个数。

set<int>mp;
mp.insert(100);
mp.insert(200);
mp.insert(300);
cout<<*mp.lower_bound(66)<<endl;
cout<<*mp.upper_bound(100)<<endl;

自定义比较函数:

typedef struct node
{
	int num;
	bool operator < (const node& c) const
	{
		return num>c.num;
	}
}point;
set<point>mp;

有些题目中,可以用到multiset (里面元素可以重复)来达到元素可重复的效果,基本的用法与set是一样的,具体就不在多说。  

https://blog.csdn.net/yas12345678/article/details/52601454 详解,可以看看。具体还是要多练。

现在有两个集合,要让他们合并起来成为一个集合,例如 set<int>a,set<int>b,将他们合成一个集合里面,这样就可以找出两个集合里面一共多少个元素,也可已找出两个集合中共有的元素数量。

set<int>mp1;
set<int>mp2;
mp1.insert(mp2.begin(),mp2.end());

就是这样将一个集合中的元素值全部插入到另一个集合中。

接下来就是一些排序的问题,有很多的方法进行解决:


	对于一个元素排序 
	set<int,less<int> >s; set<int,greater<int> >s2;
	
	
	
	
	对于一个元素,排序要求自己定义 
	struct cmp
	{
		bool operator()(const int& a,const int& b)
		{
			return a<b;    //括号指哪 哪大 
		}	
	};  //放在主函数外面
	set<int,cmp>s1;
	s1.insert(10);
	s1.insert(30);
	s1.insert(0);
	
	
	
	
	多余一个元素排序 
	set<node>s;
	s.insert(node(1,2));
	s.insert(node(3,0));
	s.insert(node(5,-5));
	set<node>::iterator it=s.begin();
	struct node
	{
		int val,key;
		node(int a1,int b1)
		{
			val=a1,key=b1;
		}
		bool operator<(const node& a)const
		{
			return 	key<a.key;     // 括号指向哪就大  
		}
	};    //这个应该是放在主函数的外面的
	

还有一个简便的用法就是,因为set有insert插入元素操作,我们就可以将其他STL容器当中的元素插入进去,简单的一个小用法:

vector  a[] list 序列容器  string类  set	mp容器 
都是可以的,只不过我们需要将set其中的数据类型改变一下,就可以运用了

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值