《算法笔记》6.2 set

一.set 的定义
1.头文件:#include<set>
2.命名空间:using namespace std
3.定义:set<typename> name;
4.定义set 数组:set<typename> Arrayname[arrayzsize]

二.set 容器内元素的访问
只能通过迭代器访问:set<typename>::iterator it;
示例:枚举元素

set<int> st;
for(set<int>::iterator it = st.begin(); it != st.end(); it++)
	printf("%d", *it);

set 内的元素自动递增排序,且去除重复元素;

三.函数
1.insert():insert(x) 将 x 插入 set 容器中,并自动排序和去重;
2.find():find(value) 返回 set 中对应值为 value 的迭代器,示例:

// set: 1 2 3
set<int>::iterator it = st.find(2);
printf("%d\n", *it);
//输出值:2

3.erase():有两种用法;
示例一:删除单个元素

1.st.erase(it),it为要删除元素的迭代器,O(1);
// set:1 2 3 4 5
st.erase(st.find(1));
// set:2 3 4 5

2.st.erase(value),value为要删除元素的值,O(logN);
// set:1 2 3 4 5
st.erase(1);
// set:2 3 4 5

示例二:删除区间内的元素
st.erase(first, last),删除 [ first, last );

// set:1 2 3 4 5
set<int>::iterator it = st.find(3);
st.erase(it, st.end());
// set:1 2

4.size()
5.clear()

三.set 的常见用途
自动去重并且按升序排序(一般去重:开数组);

四.题目
1.PAT A1063
注意:
1).如果把两个集合合并成一个集合再计算会超时,应该先将一个集合加入再遍历另一个集合;
2).如何查看一个集合中是否存在某元素:
存在:st[y].find(*it) != st[y].end()
不存在:st[y].find(*it) == st[y].end()

代码:

#include<cstdio>
#include<set>
using namespace std;
set<int> st[55];
void compare(int x, int y) {
	int totalNum = st[y].size(), sameNum = 0;
	for(set<int>::iterator it = st[x].begin(); it != st[x].end(); it++) {
		if(st[y].find(*it) != st[y].end()) sameNum++;
		else totalNum++;
	}
	printf("%.1f%\n", sameNum * 100.0 / totalNum);
}
int main() {
	int n1;
	scanf("%d", &n1);
	for(int i = 0; i < n1; i++) {
		int m;
		int num;
		scanf("%d", &m);
		for(int j = 0; j < m; j++) {
			scanf("%d", &num);
			st[i + 1].insert(num);
		}
	}
	int n2;
	scanf("%d", &n2);
	for(int i = 0; i < n2; i++) {
		int id1, id2;
		scanf("%d%d", &id1, &id2);
		compare(id1, id2);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值