C++STL 集合(set)容器用法

头文件
#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;
}
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值