set的常见用法详解
- 集合,自动内部有序且不含重复元素的容器。
- 使用环境
- 去掉重复元素
- 元素比较大或者类型不是int而不能直接开散列表
- 自动排序
- How to use?
#include<set> using namespace std;
- set的定义
- 单独定义一个set:
set<typename> name;
- set数组的定义:
set<typename> nameArray[size];
- 单独定义一个set:
- 访问元素
除开vector和string之外的stl容器都不支持*(it+1)的访问方式 - 常用函数解析
-
insert(x)
: O(logN),自动递增排序和去重 -
find(value)
: 返回set中对应值为value的迭代器,O(logN)
set<int> st; set<int>::iterator it = st.find(2); printf("%d", *it); // 也可以 printf("%d", *st.find(2));
-
erase()
: 删除单个元素,删除一个区间内的元素-
删除单个元素
1.erase(it)
: it为所需要删除的迭代器,O(1).可以结合find(value)
来使用。 例:st.erase(st.find(5));
2.erase(value)
: value为所需要删除的元素。O(logN) -
删除一个区间的元素
-st.erase(first, last)
删除[first, last), O(last-first)
-
-
size()
, O(1) -
clear()
, O(n
-
- 主要作用
- 自动去重按升序排序
- 延伸:
- set中元素是唯一的,如果需要处理不唯一的情况,则需要使用multiset。另外,c++11标准中还增加了unordered_set,以散列替代set内部的红黑树实现,使其可以用来处理去重但不排序的需求,速度比set要快得多
相关习题
#include<iostream>
#include<set>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
int N;
scanf("%d", &N);
vector<set<int> > nums(N+1);
for(int i = 1; i <= N; i++) {
int M;
scanf("%d", &M);
for(int j = 0; j < M; j++) {
int num;
// printf("[i: %d]", i);
scanf("%d", &num);
nums[i].insert(num);
}
}
//
int K;
scanf("%d", &K);
for(int a = 0; a < K; a++) {
int x, y;
scanf("%d%d", &x, &y);
int wholesize = nums[x].size() + nums[y].size();
set<int> tmp;
for(set<int>::iterator it1 = nums[x].begin(); it1 != nums[x].end(); it1++) {
tmp.insert(*it1);
}
for(set<int>::iterator it2 = nums[y].begin(); it2 != nums[y].end(); it2++) {
tmp.insert(*it2);
}
int completesize = tmp.size();
int commonsize = wholesize - completesize;
printf("%.1f%%\n", (float(commonsize)/completesize) * 100);
}
return 0;
}
网友评论