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教程 伪元素的分类及作用: 接下来让博主通过一些生动的实例(之前的作业或小作品)来说明几种常用伪类的用法和效果,其他的 ...
随机推荐
- C#中读写Xml配置文件常用方法工具类
场景 有时需要使用配置文件保存一些配置的属性,使其在下次打开时设置仍然生效. 这里以对xml配置文件的读写为例. 1.读取XML配置文. 2.写入XML配置文件. 3.匹配 XPath 表达式的第一个 ...
- Redis常用命令(Set、Hash、Zset)
1.Set(单值多value) 1. sadd.smembers key . > SADD set01 (integer) > SMEMBERS set01 ) " ) &quo ...
- Winform中使用zxing和Graphics实现自定义绘制二维码布局
场景 zxing.dll下载 https://download.csdn.net/download/badao_liumang_qizhi/11623214 效果 实现 根据上面文章中将简单的二维码生 ...
- 判断是手机端还是PC短访问
第一种:判断是手机访问还是PC访问 <script> function browserRedirect() { var sUserAgent = navigator.userAgent.t ...
- Visual Studio Code安装Python环境
如何在全宇宙最强编辑器安装Python运行环境 (雾 首先安装Python2和Python3,如果只需要用到一个的话,直接安装即可运行,不存在转换问题. 安装Python扩展,直接搜索安装即可. 更改 ...
- Python 踩坑之旅文件系统篇其一文件夹也是个文件
目录 1.1 案例 1.2 分析 1.3 扩展 1.4 技术关键字 下期预告 代码示例支持 平台: Mac OS Python: 2.7.10 代码示例: - wx: 菜单 - Python踩坑指南代 ...
- Nginx缓存原理及机制
文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. 上篇文章介绍了Nginx一个较为重要的知识点:Nginx实现接口限流.本篇文章将介绍Nginx另一个重要知识点 ...
- Spotlight性能监控工具的配置及使用
这是我离线整理资料里的内容,大概是2012年时候开始使用此性能监控工具的,直到至今,接触到几个性能监控工具里,还是美国quest公司生产的Spotlight此产品相对比较牛! 我也不知道现在发展到能支 ...
- Linux 伪终端(pty)
通过<Linux 终端(TTY)>一文我们了解到:我们常说的终端分为终端 tty1-6 和伪终端.使用 tty1-6 的情况一般为 Linux 系统直接连了键盘和显示器,或者是使用了 vS ...
- 节点操作--JavaScript
1 - 概念 网页中的所有内容都是节点(标签.属性.文本.注释),在DOM中,节点使用node来表示. HTML DOM树中的所有节点均可通过JS进行访问,所有HTML元素(节点)均可被修改,也可以创 ...