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教程 伪元素的分类及作用: 接下来让博主通过一些生动的实例(之前的作业或小作品)来说明几种常用伪类的用法和效果,其他的 ...
随机推荐
- 浅谈DanmakuView
今天简单介绍一下开源的弹幕引擎---danmakuView 使用之前在build.gradle里面添加下面这一条(目前我使用的工具是AndroidStudio 3.1.2) impleme ...
- Linux、Windows 和 Mac 中的换行符对比
原文地址:Linux.Windows 和 Mac 中的换行符对比 博客地址:http://www.moonxy.com 一.前言 经常使用 Window.Linux 等不同操作系统的开发者,在处理文本 ...
- python解释器安装和变量配置
python解释器安装 第一步https://www.python.org/ 下载 python-3.6.6 和 python-2.7.16 俩个版本 Downloads 下 选windows版本 4 ...
- ASP.NET Core 3.0 使用gRPC
一.简介 gRPC 是一个由Google开源的,跨语言的,高性能的远程过程调用(RPC)框架. gRPC使客户端和服务端应用程序可以透明地进行通信,并简化了连接系统的构建.它使用HTTP/2作为通信协 ...
- mysql隔离级别的测试
mysql提供四种隔离级别,以下分别对四种隔离级别进行测试,更加直观清晰的了解.具体的隔离级别以及其他相关介绍见https://www.cnblogs.com/eric-fang/p/11052304 ...
- Windows认证 | 域认证
在Windows中的身份认证方式有很多,也在不断的升级,但是在域中,依旧使用的是Kerberos认证. Kerberos 是一种网络认证协议,它的实现不依赖于主机操作系统的认证,无需基于主机地址的信任 ...
- Spring MVC-从零开始-web.xml中classpath和classpath* 有什么区别
web.xml中classpath和classpath* 有什么区别?classpath:只会到你的class路径中查找找文件;classpath*:不仅包含class路径,还包括jar文件中(cla ...
- redis分布式锁-自动超时锁(在用)
1.加锁代码结构 2.解锁代码结构 3.java实例 4.测试类 5.测试日志 加锁代码结构 def acquire_lock_with_timeout(conn,lockname,acquire_t ...
- centos7 Apache开启URL重写组件并配置.htaccess实现伪静态
第一.修改httpd.conf文件 A - 在etc/httpd/conf/目录下的httpd.conf 文件,找到: LoadModule rewrite_module modules/mod_re ...
- 【SQL server初级】SQL索引(一)
SQL索引[一](此文章为“数据库性能优化二:数据库表优化”附属文章之一) SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开 ...