C++ STL set集合的使用
一些涉及到集合的算法题目,可以考虑使用STL里的set来很方便地解决问题。
set的本质是红黑树(一种比较优秀的平衡二叉树)。
set集合需要用到的头文件是set: #include<set>
常用方法:
1)set<int> ds 建立一个名为ds、元素类型为int的集合
2)ds.insert(x) 在集合中插入一个元素,如果已经存在,则什么也不干
3)ds.erase(x) 在集合中删除元素x,如果不存在,则什么也不干
4)ds.erase(it) 在集合中删除地址为it的元素
5)ds.end( ) 返回集合中最后一个元素的下一个元素的地址。
6)ds.find(x) 查询x在集合中的地址,如果不存在,则返回ds.end()
7)ds.lower_bound(x) 查询不小于x的最小的数在集合中的地址,不存在则返回ds.end()
8)ds.upper_bound(x) 查询大于x的最小的数在集合中的地址,不存在则返回ds.end()
9)ds.empty() 如果集合空 返回1 否则返回0
10)ds.size() 返回集合中元素的个数
这里提到的“地址”实际上是对应元素的迭代器。
lower_bound返回的迭代器,可以对其++找到后继元素的迭代器,也可以--找到前继元素的迭代器。
需要注意指向元素的迭代器,如果已经是begin(),则不能--,如果是end(),则不能++。
光说光看 知识是不够全面的,来结合题目看看。
题目选自洛谷P5250
题目描述
博艾市有一个木材仓库,里面可以存储各种长度的木材,但是保证没有两个木材的长度是相同的。作为仓库负责人,你有时候会进货,有时候会出货,因此需要维护这个库存。有不超过 100000 条的操作:
- 进货,格式
1 Length
:在仓库中放入一根长度为 Length(不超过 10^9109) 的木材。如果已经有相同长度的木材那么输出Already Exist
。 - 出货,格式
2 Length
:从仓库中取出长度为 Length 的木材。如果没有刚好长度的木材,取出仓库中存在的和要求长度最接近的木材。如果有多根木材符合要求,取出比较短的一根。输出取出的木材长度。如果仓库是空的,输出Empty
。
输入格式
无
输出格式
无
输入输出样例
输入 1
7 1 1 1 5 1 3 2 3 2 3 2 3 2 3
输出 1
3 1 5 Empty
解题代码:
#include<stdio.h>
#include<iostream>
#include<set>
using namespace std;
int n,opt,len;
set<int> ds;
int main(){cin>>n;while(n--){cin>>opt>>len;if(opt == 1)if(ds.find(len)!=ds.end()) cout<<"Already Exist"<<endl;else ds.insert(len);else if(ds.empty())cout<<"Empty"<<endl;else{set<int> ::iterator i = ds.lower_bound(len),j=i;if(j != ds.begin()) --j;if(i != ds.end() && len-(*j)>(*i)-len) j = i;cout<<(*j) <<endl,ds.erase(j);}}return 0;
}
C++ STL set集合的使用相关推荐
- C++STL常用集合算法
C++STL常用集合算法 学习目标 算法简介 set_intersection 功能描述 函数原型 示例 总结 set_union 功能描述 函数原型 示例 总结 set_difference 功能描 ...
- C++ STL map集合的使用
有时需要根据索引找到对应的元素,像键值对一样的查找,并对这些元素进行操作.可以同故宫调用STL里面的map来解决这个问题. map关联集合的本质也是一棵红黑树,可以看做一个下标可以是任意类型的数组. ...
- STL初步——集合Set
『写在前面的一些基础语法』 1.定义 和 赋值 set<int> a={1,2}; set<char> b={"1","2"}; set ...
- 单词数 (STL set集合)
单词数 Problem Description lily的好朋友xiaoou333近期非常空.他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数.以下你的任务是帮助xiaoou333解决问 ...
- 【C++ 与 STL】集合:set
方法: begin() 返回指向第一个元素的迭代器 clear() 清除所有元素 count() 返回某个值元素的个数 empty() 如果集合为空,返回true(真) end() 返回指向最后一个元 ...
- [C++STL]常用集合算法
代码如下: #include <iostream> #include <vector> #include <numeric> #include <algori ...
- BZOJ3578:GTY的人类基因组计划2(集合hash,STL)
Description GTY召唤了n个人来做实验,GTY家的房子很大,有m个房间一开始所有人都在1号房间里,GTY会命令某人去某个房间等待做实验,或者命令一段区间的房间开始实验,实验会获得一些实验信 ...
- 结合泛型与模板的STL.NET
开始之前,先来看一个笑话,当问一个C++程序员怎样完成一个给定的任务时,他(她)可能会提供一打或更多的潜在解决方案列表,但又会极其详细地标出每种方案的问题之处,让你不知所措,难以选择.而Visual ...
- C++STL常用算术生成算法
C++STL常用集合算法 学习目标 注意 算法简介 accumulate 功能描述 函数原型 示例 总结 fill 功能描述 函数原型 示例 总结 学习目标 掌握常用的算术生成算法 注意 算术生成算法 ...
最新文章
- PK3Err0040: The target device is not ready for debugging. Please check your configuration bit settin
- Xcode自定义字体不能应用的原因
- ps命令使用 进程查看
- 电话光端机的电话业务不通问题,该怎么去检查?
- android xml正方形,使用Android Constraintlayout创建一排均匀分布的正方形
- java代码限制短信发送次数_java如何实现发短息限制日发送次数代码
- php转go注意,PHP转Golang一些感想
- Linux中usb设置burst,Re: 关于IMX6UL第二个USB接口在linux驱动的问题
- Three20 NetWork
- 用ffmpeg快速剪切和合并视频
- php --- 二维码生成代码
- 【洛谷】P3369 【模板】普通平衡树
- nodejs addon实现回调函数事件
- docker具名挂载与匿名挂载
- linux安装Oracle11g详细教程(redhat6、Centos7)
- VTK和numpy的整合
- 51单片机三线串行驱动12864液晶
- 黑龙江职业学院计算机考试,黑龙江职业学院官网
- CHP城市猎人系统开发
- java实现第七届蓝桥杯搭积木
热门文章
- yum install rpm包时报错
- 发送邮件 (Send Email)
- linux 下一条命令查出arp
- python 复数幂_python基础学习——运算符(1)
- 人人开源项目文档_为什么图对于您的开源项目文档至关重要
- h5海报设计开源工具_5个用于教幼儿阅读的开源工具
- 如何使用PerfSONAR测试网络
- SLAM GMapping(6)扫描匹配器
- php7 mcrypt模块_如何在php7.2/php7.3中安装mcrypt扩展?
- python画图x轴丢值_python-从pyplot绘图中擦除先前绘制的内容