头文件:
#include< set >
using namespace std
构造声明集合:
set< T > s;
定义了一个名为s的、储存T类型的数据集合,其中T是集合要储存的数据类型。初始的时候是空集合
具体操作:
1.插入集合元素:
(默认情况下下,元素按照从小到大插入)
集合名.insert(元素)
示例:
#include< cstdio >
#include< set >
using namespace std;
int main()
{
set< int >a;
a.insert(1);//{1}
a.insert(2);//{1,2}
a.insert(3);//{1,2,3}
a.insert(2);//{1,2,3}
return 0;
}
2.删除集合元素(删除集合的一个元素,如果集合中不存在这个元素,不进行任何操作)
集合名.erase(元素)
删除区间元素:集合名.earse(迭代器a,迭代器b)
示例:
#include< cstdio >
#include< set >
using namespace std;
int main()
{
set< int >a;
a.insert(1);//{1}
a.insert(2);//{1,2}
a.insert(3);//{1,2,3}
a.erase(1);//{2,3};
a.erase(0);//{2,3}
return 0;
}
3.判断集合元素是否存在(存在返回1,否则返回0)
集合名.count(元素)
示例:
#include< cstdio >
#include< set >
using namespace std;
int main()
{
set< int >a;
a.insert(1);//{1}
a.insert(2);//{1,2}
a.insert(3);//{1,2,3}
if(a.count(1))
{
printf("存在");
}
return 0;
}
4.遍历集合元素(需要用到迭代器)
迭代器:迭代器就像一根手指指向set中的某个元素, 通过 * 提取迭代器指向的元素,通过++操作让迭代器指向下一个元素,–指向上一个元素
迭代器写法比较固定,set< T >::iterator it就定义了一个指向set< T >这种集合的迭代器it,T是任意数据类型。其中::iterator是固定的写法。
begin函数返回容器中起始元素的迭代器,end函数返回容器的尾后迭代器。(end最后一位的后一位)
示例:
#include<cstdio>
#include<set>
using namespace std;
int main()
{
set<int> a;
a.insert(1);//{1}
a.insert(2);//{1,2}
a.insert(3);//{1,2,3}
set<int>::iterator it;//声明迭代器
for(it=a.begin();it!=a.end();it++)//遍历
printf("%d ",*it);//输出迭代器指向的元素
return 0;
}
结果:
5.清空(同时会清空set占用内存 内存)
集合名.clear();
示例:
#include<cstdio>
#include<set>
using namespace std;
int main()
{
set<int> a;
a.insert(1);//{1}
a.insert(2);//{1,2}
a.insert(3);//{1,2,3}
a.clear();
set<int>::iterator it;//声明迭代器
for(it=a.begin();it!=a.end();it++)//遍历
printf("%d ",*it);//输出迭代器指向的元素
return 0;
}
结果:
6.set结构体
由于set是有序的,所以我们需要一种方式来告诉系统怎么比较这个结构体的大小。其中一种方法叫做运算符重载,我们需要重新定义小于符号
struct Node{
int x,y;
bool operator<(const Node &rhs)const{
if(x!=a.x){
return x<rhs.x;
}else{
return y<rhs.y;
}
}
}
};
operator<表示我们要重载运算符<,可以看成是一个函数名。rhs是"right hand
side"的简称,有有操作的意思,这里我们定义为一个const引用。因为该运算符重载定义在结构体内部,左操作数就当前调用operator<的对象.
特别要注意,不要漏掉最好的const。const函数表示不能对其数据进行修改操作,并且const对象不能调用非const成员函数,只允许调用const成员函数。
上面重载规定排序方式为,按照x从小到大排序,如果x相同,那么按照y从小到大排序。经过了<运算符重载的结构体,我们就可以比较两个Node对象的大小了,因此可以直接储存在set中了
实例:用集合实现以下操作
输入:第一行输入n,表示n组数据,接下来n行输入n组数据(x,y)
输出:按x大小排序输出,如果x相等按y大小输出
代码:
#include<cstdio>
#include<set>
using namespace std;
struct Node{
int x,y;
bool operator<(const Node &rhs)const//重载运算符
{
if(x==rhs.x)
{
return y<rhs.y;
}else
{
return x<rhs.x;
}
}
};
int main()
{
set<Node>a;//定义集合
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
Node t;
scanf("%d %d",&t.x,&t.y);
a.insert(t);//输入集合数
}
set<Node>::iterator it;//定义迭代器
for(it=a.begin();it!=a.end();it++)//遍历
printf("%d %d\n",it->x,it->y);//输出迭代器指向的元素
return 0;
}
结果:
7.find(查找集合中某个元素)
集合名.find(元素)//返回迭代器位置
如果没有找到返回值为最后一个元素的下一个位置,也就是end()
#include<stdio.h>
#include<set>
using namespace std;
int main()
{
set<int> st;
for(int i=1;i<=3;i++){
st.insert(i);
}
set<int>::iterator it = st.find(2);///在set里查找2,返回其迭代器
printf("%d\n",*it);
return 0;
}