100000597 - 《算法笔记》6.2小节——C++标准模板库(STL)介绍->set的常见用法详解

本文详细介绍了C++标准模板库(STL)中的set容器,包括其定义、访问方式、常用函数及其应用实例。set容器能自动进行元素排序和去重,适用于需要对数据进行排序和去重操作的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《算法笔记》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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值