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其中的数据类型改变一下,就可以运用了