set是集合,是一个内部自动有序且不含重复元素的容器
要去掉重复元素的情况,而且有可能因这些元素比较大或者类型不是int型而不能直接开散列表
set提供更为直接的接口,加入了set之后可以实现自动排序
#include<set>
单独定义一个set
set<typename> name;
set数组的定义和vector相同
set<typename> Arrayname[arraySize]; set<int> a[100];
set只能通过迭代器访问
//set只能通过迭代器访问 set<typename>::iterator it;
由于除开vector和string之外的STL容器都不支持*(it+i)的访问方式,只能枚举,而且不支持it<s.end()的写法,只能用it!=s.end(),set内的元素自动递增排序,且自动去除了重复元素
for(set<int>::iterator it=st.begin();it!=st.end();it++){ cout<<*it; }
set常用函数解析
st.insert()//将x插入set容器 st.find()//find返回set种对应值为value的迭代器,时间复杂度为O(logN),N为set内的元素个数 st.erase(it)//it为所需要删除元素的迭代器,时间复杂度O(1) st.erase(value)//value为所需要删除的值 st.erase(first,last)//删除一个区间内的所有元素[first,last) st.size()//用来获得set内元素的个数,时间复杂度为O(1) st.clear()//用来清空set中的所有元素,复杂度为O(N),其中N为set内元素的个数
set的常见用途
set最主要的作用 是自动去重并按升序排序,因此碰到需要去重但不方便直接开数组的情况,用set解决
set中元素是唯一的,如果需要处理不唯一的情况,则需要使用multiset
例题:
Set Similarity
题目描述:
Given two sets of integers, the similarity of the sets is defined to be Nc/Nt*100%, where Nc is the number of distinct common numbers shared by the two sets, and Nt is the total number of distinct numbers in the two sets. Your job is to calculate the similarity of any given pair of sets.
输入:
Each input file contains one test case. Each case first gives a positive integer N (<=50) which is the total number of sets. Then N lines follow, each gives a set with a positive M (<=104) and followed by M integers in the range [0, 109]. After the input of sets, a positive integer K (<=2000) is given, followed by K lines of queries. Each query gives a pair of set numbers (the sets are numbered from 1 to N). All the numbers in a line are separated by a space.
输出:
For each query, print in one line the similarity of the sets, in the percentage form accurate up to 1 decimal place
样例输入:
3 3 99 87 101 4 87 101 5 87 7 99 101 18 5 135 18 99 2 1 2 1 3
样例输出:
50.0% 33.3%
来源:
http://codeup.cn/problem.php?cid=100000597&pid=0
翻译:
每个输入文件包含一个测试用例。 每个案例首先给出一个正整数N(<= 50),它是集合的总数。 然后跟随N行,每行给出一个具有正M(<= 104)的集合,然后是[0,10^9]范围内的M个整数。 输入集合后,给出正整数K(<= 2000),后跟K行查询。 每个查询给出一对设置号(设置从1到N编号)。 一行中的所有数字都用空格分隔。
对于每个查询,以百分比形式准确地显示集的相似性,精确到小数点后一位。
#include<iostream> #include<set> #include<iomanip> using namespace std; int main(){ int n,m; while(cin>>n){//表示set数组的个数 set<int> s[n]; for(int i=0;i<n;i++){ cin>>m;//每个set数组的长度 set<int> tmp; for(int j=0;j<m;j++){ int num; cin>>num; tmp.insert(num);//赋值给tmp } s[i]=tmp; } int k; //需要查询几次 cin>>k; for(int i=0;i<k;i++){ int a,b;//要查询的两个数组编号 cin>>a>>b; int nc=0,nt=s[b-1].size(); for(set<int>::iterator it=s[a-1].begin();it!=s[a-1].end();it++){ if(s[b-1].find(*it)==s[b-1].end()){ nt++; } else{ nc++; } } cout<<fixed<<setprecision(1)<<(double)nc/nt*100<<"%"<<endl; } } return 0; }