2. set的常见用法详解
set翻译为集合,是一个内部自动有序且不含重复的容器。如果要使用set,需要添加头文件#include <set> 另外还要加上using namespace std;
PAT中的相关题目有(代码见下方):
2.1 set的定义
与vector类似,set的定义为set<typename> name,例如:set<int> name;
2.2 set容器内元素的访问
set只能通过迭代器(iterator)访问,迭代器格式与vector格式一致,为set<typename>::iterator it=st.begin(); 支持*it访问。
2.3 set常用函数
(1)insert():insert(x),将x插入set容器中,并自动递增去重。示例:st.insert(1);
(2)find():find(value)返回set中对应值为value的迭代器。示例:set<int>::iterator it=st.find(2);在set找到2返回迭代器。
(3)erase():删除set中单个元素或者区间元素。示例:st.erase(2)或者st.erase(it,st.end());删除元素2到set末尾的元素。
(4)size():size()用来获得set元素的个数。示例:st.size();。
(5)clear():用来清空set中的所有元素。示例:st.clear()。
现在附上PAT中关于set题目的代码:
#include <stdio.h>
#include <set>
#include <iostream>
using namespace std;
const int N=51;
set<int> st[N];
void compare(int a,int b){
int totalNum=st[b].size(),sameNum=0; //totalNum为新的元素
for(set<int>::iterator it=st[a].begin();it!=st[a].end();it++){ //it和st[a].end()不能用<或>
if(st[b].find(*it)!=st[b].end()) sameNum++; //存在这个数,注意判断方法
else totalNum++;
}
printf("%.1f%%\n",sameNum*100.0/totalNum); //100.0要乘在分子上,不能乘在分母上
}
int main(){
int n,m,k,x,y,z;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&m);
for(int j=0;j<m;j++){
scanf("%d",&k);
st[i].insert(k);
}
}
scanf("%d",&x);
for(int i=0;i<x;i++){
scanf("%d%d",&y,&z);
compare(y,z);
}
return 0;