一.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;
}