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教程 伪元素的分类及作用: 接下来让博主通过一些生动的实例(之前的作业或小作品)来说明几种常用伪类的用法和效果,其他的 ...
随机推荐
- scala函数式编程(二) scala基础语法介绍
上次我们介绍了函数式编程的好处,并使用scala写了一个小小的例子帮助大家理解,从这里开始我将真正开始介绍scala编程的一些内容. 这里会先重点介绍scala的一些语法.当然,这里是假设你有一些ja ...
- Spring入门(十二):Spring MVC使用讲解
1. Spring MVC介绍 提到MVC,参与过Web应用程序开发的同学都很熟悉,它是展现层(也可以理解成直接展现给用户的那一层)开发的一种架构模式,M全称是Model,指的是数据模型,V全称是Vi ...
- JDBC的批处理学习rewriteBatchedStatements=true
如果在不添加批处理指令的情况下,mysql默认是不使用批处理操作,如果在url尾部添加rewriteBatchedStatements=true 可以使当前连接 使用批处理操作 创建数据库表结构 cr ...
- 第六届蓝桥杯java b组第二题
立方变自身 观察下面的现象,某个数字的立方,按位累加仍然等于自身. 1^3 = 1 8^3 = 512 5+1+2=8 17^3 = 4913 4+9+1+3=17 … 请你计算包括1,8,17在内, ...
- 敏捷测试--之scrum--原理
Scrum 是一个用于开发和维持复杂产品的框架 ,是一个增量的.迭代的开发过程.在这个框架中,整个开发过程由若干个短的迭代周期组成,一个短的迭代周期称为一个Sprint,每个Sprint的建议长度是2 ...
- CentOS 7上编写自定义系统审计规则
1)简介 Linux审计系统创建审计跟踪,这是一种跟踪系统上各种信息的方法.它可以记录大量数据,如事件类型,日期和时间,用户ID,系统调用,进程,使用的文件,SELinux上下文和敏感度级别.它可以跟 ...
- 两个变量交换数字 不用第三个变量的情况下 int a = 5,b = 6
今天可是涨见识额 记录一下 第一种方法: a=a+bb=a-ba=a-b 第二种: b= a+(a=b)*0 一句话搞定
- 编程范式 --- 面向协议编程(Protocol Oriented Programming,简称POP)
面向协议编程(Protocol Oriented Programming,简称POP) 是Swift的一种编程范式,Apple于2015年WWDC踢出 在Swift的标准库中,能见到大量POP的影子 ...
- 23种设计模式之单例(Singleton Pattern)
单例 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例(eg:应对一些特殊情况,比如数据库连接池(内置了资源) 全局唯一号码生成器),才能确保它们的逻辑正确性.以及良好的效率 ...
- 升级@Scheduled-分布式定时任务
最近我在对项目的定时任务服务升级,希望改造成分布式,原本是利用@Scheduled注解实现,然而它并不支持分布式,如果改成quartz或者Spring Cloud Task,感觉对于自己这个简单的项目 ...