set作为STL中存储数据的一种容器,底层使用红黑树作为内部结构。存入set中的数据具有单一不重复、自动升序,因此可看做一个升序元素的集合。
基本操作如下
set <int> s;
s.insert(x)//向s中插入x元素
s.begin()//返回s中第一个元素的迭代器
s.end()//返回s中最后一个元素的迭代器
s.size()//返回s中元素个数
s.empty()//判断s是否为空
s.find(x)//返回x的迭代器
s.count(x)//返回x出现次数
注意的是end()函数返回的实际是最后一个元素旁边的迭代器,但当直接使用时仍是最后一个元素本身,例如
int a[5]={
2,1,3,5,4};
set <int> s;
for(int i=0;i<5;i++)
s.insert(a[i]);
set<int>::iterator it;
it=s.end();
cout<<*it<<endl;
输出结果即是 5
但在find(x)函数中,若查询的x元素不存在,迭代器将会返回到end(),此时若不加以判断,则会返回s中的最后一个元素造成错误,因此若使用find()函数可以加上语句
int x;
while(cin>>x)
{
it=s.find(x);
if(it!=s.end())
cout<<*it<<endl;
else
cout<<"no"<<endl;
}
输出结果如下
另一方面,若是想判断元素是否在set中存在,也可使用count()函数。由于set容器的特点,每个元素x只会在set中出现一次,因此count(x)的返回值只有0和1,即返回1则元素x存在,返回0则元素x不存在
int x;
while(cin>>x)
{
cout<<s.count(x)<<endl;
}
贴一道例题
集合相似度 pta
给定两个整数集合,它们的相似度定义为:Nc /Nt ×100%。其中Nc是两个集合都有的不相等整数的个数,Nt
是两个集合一共有的不相等整数的个数。你的任务就是计算任意一对给定集合的相似度。
输入格式:
输入第一行给出一个正整数N(≤50),是集合的个数。随后N行,每行对应一个集合。每个集合首先给出一个正整数M(≤104 ),是集合中元素的个数;然后跟M个[0,109 ]区间内的整数。
之后一行给出一个正整数K(≤2000),随后K行,每行对应一对需要计算相似度的集合的编号(集合从1到N编号)。数字间以空格分隔。

输出格式:
对每一对需要计算的集合,在一行中输出它们的相似度,为保留小数点后2位的百分比数字。
输入样例:
3
3 99 87 101
4 87 101 5 87
7 99 101 18 5 135 18 99
2
1 2
1 3
输出样例:
50.00%
33.33%
解题思路:题意即是判断给定两集合交集和并集的比值,用set就可以很方便的解决,开一个set型数组分别记录集合,遍历查询即可。确实是因为这道题学习了set的用法。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <queue>
#include <stdio.h>
#include <cstring>
#include <set>
using namespace std;
int n;
set < int > s[100];
void f(int a,int b)
{
int x=0;
set < int > ::iterator it;
for(it=s[a].begin();it!=s[a].end();it++){
if(s[b].find(*it)!=s[b].end()){
x++;
}
}
int sum = s[a].size() + s[b].size();
double t=(double)x/(sum-x)*100;
printf("%.2lf%%\n",t);
}
int main()
{
int k,a,b,m;
cin >> n;
for(int i=1;i<=n;i++)
{
cin >> k;
while(k--)
{
cin>>a;
s[i].insert(a);
}
}
cin>>m;
while(m--)
{
cin>>a>>b;
f(a,b);
}
return 0;
}
拙见至此 欢迎指正