STL-set 容器以及迭代器的简单理解
先说下set的基本操作和时间复杂度
begin() ,返回set容器的第一个元素
end() ,返回set容器的最后一个元素
clear() ,删除set容器中的所有的元素
empty() ,判断set容器是否为空
max_size() ,返回set容器可能包含的元素最大个数
size() ,返回当前set容器中的元素个数
find() , 如果找到返回其位置,找不到返回end()
其中插入和find的时间复杂多是O(logn)
再说下迭代器的用法 iterator是指针的一种泛化 http://www.daxueit.com/article/3101.html 这里有详细的介绍
下面给出一个实验代码 用来测试find 以及iterator的指向作用 *it表示访问it表示的实体
set<int> s;
int a,b,c;
cin>>a>>b>>c;
s.insert(a);
s.insert(b);
s.insert(c);
set<int>::iterator it;
it=s.find(b);
cout<<*it<<endl;
这里给出一个用set容器的题目
l2-005 集合相似度
给定两个整数集合,它们的相似度定义为: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%
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<set> using namespace std; set<int> s[55]; void f(int x,int y) { int ret=0; set<int>::iterator it;// for(it=s[x].begin();it!=s[x].end();it++) { if(s[y].find(*it)!=s[y].end()) ret++; // if(s[y].count(*it)==0) ret++; } int sum=s[x].size()+s[y].size(); int nc=ret,nt=sum-ret; double temp=(nc*1.0)/(nt*1.0); printf("%.2lf",temp*100); cout<<'%'<<endkl; } int main() { int n; cin>>n; for(int i=1;i<=n;i++) s[i].clear(); for(int i=1;i<=n;i++) { int len; cin>>len; while(len--) { int x; cin>>x; s[i].insert(x); } } int k; cin>>k; while(k--) { int x,y; cin>>x>>y; f(x,y); } return 0; }
路漫漫其修远兮,吾将上下而求索