C++ set 用法略解
@
初步用法讲解
先看一段代码。
#include<iostream>
#include<set>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
set<int> s;
int n;
int a;
int main(){
	cin>>n;
	for(int i=1;i<=n;++i){
		cin>>a;
		s.insert(a);
	}
	for(set<int>::iterator it=s.begin();it!=s.end();++it)
		cout<<*it<<' ';	//flag
}
以上代码概括地介绍了 set 的部分语法。该程序运行结果如下图。

我们看到,set 内部是有序的,STL 提供了一种迭代器 iterator,用于遍历 set。
set 是一个平衡树,支持以下几种操作:
- 插入一个元素;
- 删除一个元素;
- 查询一个元素的前驱、后继。
每次操作的时间复杂度 \(O(\log n)\)。
下表列出了 set 的部分常用函数。
| 函数名称 | 函数功能 | 
|---|---|
| begin() | 返回 set 初始元素迭代地址 | 
| end() | 返回 set 末尾元素迭代地址 +1 | 
| insert(type x) | 插入元素 \(x\) | 
| erase(type x) | 删除元素 \(x\) | 
| size() | 返回 set 的元素个数 | 
| clear() | 清空 set | 
| empty() | 判断 set 是否为空 | 
| find(type x) | 返回元素 \(x\) 在 set 中的迭代器 | 
| count(type x) | 返回元素 \(x\) 在 set 中的出现次数 | 
进阶用法讲解
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<set>
#include<algorithm>
using namespace std;
set<int> s;
int n;
int a;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%d",&a);
		s.insert(a);
	}
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%d",&a);
		set<int>::iterator it=s.lower_bound(a);
		printf("%d\n",(*it));
	}
}
上段代码使用了函数 lower_bound(),他是什么意思呢?
lower_bound(type x) 函数用来返回 set 中大于等于 \(x\) 且最小的数的迭代器。如果set 中没有满足条件的数,返回 end()。
upper_bound(type x) 与他类似。他被用来返回 set 中 严格大于 \(x\) 且最小的数的迭代器。如果set 中没有满足条件的数,返回 end()。
注意事项
- end()返回的是末尾元素迭代地址 +1;
- erase()未能成功删除元素时对 set 不产生影响;
- find()未能成功找到元素时返回的是- end();
- lower_bound()、- upper_bound()未能找到元素时返回的是- end();
- 函数
bool function(){
	set<int> s;
	s.insert(10);s.insert(20);
	set<int>::iterator it=s.lower_bound(9);
	printf("%d\n",*it);--it;
	return bool(it==s.begin());
}
被调用后输出 10,返回值是 true。
例题
例题 您需要写一个数据结构,维护一个初始长度为空的序列,支持以下操作:
- 将整数 \(x\) 加入序列;
- 查询序列中小于等于 \(x\) 且最大的数,若没有则输出 brz is a pig;
- 查询序列中大于等于 \(x\) 且最小的数,若没有则输出 brz is a pig。
参考代码 使用 1 个 set 维护序列,对于 1. 操作直接 insert(),对于 3. 操作 lower_bound(),2. 操作细节比较多,详见代码。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<set>
using namespace std;
set<int> s;
int n;
int sx,sy;
set<int>::iterator it;
set<int>::iterator find(int x){
	it=s.lower_bound(x);
	if((*it)==x) return it;
	else return (it==s.begin())?s.end():(--it);
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%d%d",&sx,&sy);
		switch(sx){
			case 1:
				s.insert(sy);
				break;
			case 2:
				it=find(sy);
				if(it==s.end()) puts("brz is a pig");
				else printf("%d\n",*it);
				break;
			case 3:
				it=s.lower_bound(sy);
				if(it==s.end()) puts("brz is a pig");
				else printf("%d\n",*it);
				break;
			default:
				break;
		}
	}
}
练习
练习 已知 Jim 有 \(n\) 个宝石,现在他将这 \(n\) 个宝石从 \(1\) 到 \(n\) 排开编号从 \(1\) 到 \(n\)。Jim 发现他所有的宝石中竟然有不少是完全相同的的,我们规定每个宝石都有一个特征值 \(a_i\),当两个宝石特征值相等时认为两个宝石相同。Jim 发现两个相同的宝石离得越接近越明显。Jim 现在有 \(m\) 个问题,他想问你在编号 \(l\) 到 \(r\) 这一区间里的所有宝石中,两个相同宝石的最近距离是多少(两个宝石的距离是它们编号的绝对值之差)。\(1\leq n,m\leq 2\times10^5\)。
C++ set 用法略解的更多相关文章
- CSS3的@keyframes用法详解:
		CSS3的@keyframes用法详解:此属性与animation属性是密切相关的,关于animation属性可以参阅CSS3的animation属性用法详解一章节. 一.基本知识:keyframes ... 
- C++中的STL中map用法详解(转)
		原文地址: https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html C++中的STL中map用法详解 Map是STL的一个关联容器,它提供 ... 
- grep用法详解:grep与正则表达式【转】
		转自:http://blog.csdn.net/hellochenlian/article/details/34088179 grep用法详解:grep与正则表达式 首先要记住的是: 正则表达式与通配 ... 
- Vue插件编写、用法详解(附demo)
		Vue插件编写.用法详解(附demo) 1.概述 简单来说,插件就是指对Vue的功能的增强或补充. 比如说,让你在每个单页面的组件里,都可以调用某个方法,或者共享使用某个变量,或者在某个方法之前执行一 ... 
- C#中string.format用法详解
		C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ... 
- @RequestMapping 用法详解之地址映射
		@RequestMapping 用法详解之地址映射 引言: 前段时间项目中用到了RESTful模式来开发程序,但是当用POST.PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没 ... 
- linux管道命令grep命令参数及用法详解---附使用案例|grep
		功能说明:查找文件里符合条件的字符串. 语 法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] ... 
- mysql中event的用法详解
		一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ... 
- CSS中伪类及伪元素用法详解
		CSS中伪类及伪元素用法详解 伪类的分类及作用: 注:该表引自W3School教程 伪元素的分类及作用: 接下来让博主通过一些生动的实例(之前的作业或小作品)来说明几种常用伪类的用法和效果,其他的 ... 
随机推荐
- mysql中查询字段为null或者不为null的sql语句怎么写?
			在mysql中,查询某字段为空时,切记不可用 = null,而是 is null,不为空则是 is not null select * from table where column is null; ... 
- windows平台:查看端口占用情况,请杀死端口对应进程PID
			//查看 netstat -ano | findstr //杀死 taskkill /f /PID 
- unittest核心要素
			1 TestCase 一个TestCase的实例就是一个测试用例.什么是测试用例呢?就是一个完整的测试流程, 包括测试环境的准备(setUp),执行测试代码(run),以及测试后环境的还原(tearD ... 
- 使用Bookinfo应用测试Kuma服务网格
			最近,开源API管理平台Kong服务供应商近日放出了新的开源项目Kuma.本文尝试将 bookinfo 应用部署在 Kuma 网格中,以便帮助大家更好的理解 Kuma 项目. Kuma是能用于管理 ... 
- 关于WebApi的跨域问题
			前端调用我后端接口时出现200,跨域问题 解决方案: 在webconfig中加入以下配置就OK了 <configuration> <system.webServer> < ... 
- Hadoop集群常用的shell命令
			Hadoop集群常用的shell命令 Hadoop集群常用的shell命令 查看Hadoop版本 hadoop -version 启动HDFS start-dfs.sh 启动YARN start-ya ... 
- EditPlus 全系列 注册码
			EditPlus4注册码 注册名:host1991 序列号:14F50-CD5C8-E13DA-51100-BAFE6 注册名:360xw 注册码:93A52-85B80-A3308-BF130-4 ... 
- React学习笔记(持续更新)
			2.2页面加载过程 1.资源加载过程:URL->DNS查询->资源请求->浏览器解析 ①URL结构:http://www.hhh.com:80/getdata?pid=1#title ... 
- SpringBoot起飞系列-配置文件(三)
			一.SpringBoot中的配置文件 说起到配置文件,大家并不陌生,早在springboot之前,我们用ssh,ssm框架开发的时候整天都要接触配置文件,那时候的配置文件基本上都是.propertie ... 
- Graphlab create的基本使用
			写在前面 GraphLab Create 是一款机器学习的函数库,其中的SFrame也是十分强大的数据管理工具.它允许直接从硬盘中读取数据,免于将数据全部加载到内存中.这就使得对于大数据的处理成为可能 ... 
