《算法笔记》6.2小节——C++标准模板库(STL)介绍->set的常见用法详解
set是内部自动有序且不含重复元素的容器,作用是自动取重且升序排序
如果需要去重但不方便再开数组,可用set
若需要不去重,则使用multset
1、头文件
#include <set>
using namespace std;
2、定义
set <int> stu;
set <int> stu[20]; //stu中的每个元素都是一个set容器(相当于有set功能的二维数组)
set <vector<int> > stu;
3、访问
只能通过迭代器访问
STL容器中除了vector和string之外,都不支持通过*(ip+i)直接访问第i个元素。
#include <vector>
using namespace std;
//定义迭代器iterator,类似指针
set<int>::iterator ip;
//通过*ip访问set里的元素,只能枚举访问
//不支持ip<vi.end()的写法,只能写ip!=vi.end;
for(set<int>::iterator ip =si.begin;ip!=si.end();ip++){
printf("%d ",*ip);
}
4、函数
①在set中添加元素insert
并自动递增排序和去重,时间复杂度O(logN)
//把元素x插入到vi的末尾
si.insert(x);
si.insert(1);
②查找元素find
查找并返回元素x的迭代器(所在位置)
//在si中查找并返回元素2的迭代器
set<int>::iterator ip = si.find(2);
printf("%d\n",*ip);
//或合成一句
printf("%d\n",*(si.find(2));
③元素个数size
时间复杂度O(1)
//返回值为unsigned,一般用%d
num=si.size();
④清空clear
时间复杂度O(N)
si.clear();
⑤删除单个元素或一个区间内的所有元素eraser
//删除值为2的元素
si.eraser(2);
//删除迭代器所在位置的元素,可配合find()使用
si.eraser(si.find(2));
//删除[first,last)区间内的元素,如删除元素30至末尾之间的元素
set<int>::iterator ip=si.find(30);
si.eraser(ip,si.end());
6126 Problem A Set Similarity (25)
#include <stdio.h>
#include <string.h>
#include <set>
#include <algorithm>
using namespace std;
double simi(set<int> a,set<int> b) {
int nonum = 0, simnum = 0;
for (set<int>::iterator i = a.begin(); i != a.end(); i++) {
if (b.count(*i) != 0) {
simnum++;
}
else
nonum++;
}
return simnum * 1.0 / (b.size()+nonum) * 100;
}
int main() {
int n;
scanf("%d", &n);
set<int> que[105];
for (int i = 0; i < n; i++) {
int m;
scanf("%d", &m);
for (int j = 0; j < m; j++) {
int temp;
scanf("%d", &temp);
que[i].insert(temp);
}
}
int k;
scanf("%d", &k);
for (int i = 0; i < k; i++) {
int a, b;
scanf("%d %d", &a, &b);
double similarity = simi(que[a-1],que[b-1]);
printf("%.1f%%\n", similarity);
}
return 0;
}