一些涉及到集合的算法题目,可以考虑使用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集合的使用相关推荐

  1. C++STL常用集合算法

    C++STL常用集合算法 学习目标 算法简介 set_intersection 功能描述 函数原型 示例 总结 set_union 功能描述 函数原型 示例 总结 set_difference 功能描 ...

  2. C++ STL map集合的使用

    有时需要根据索引找到对应的元素,像键值对一样的查找,并对这些元素进行操作.可以同故宫调用STL里面的map来解决这个问题. map关联集合的本质也是一棵红黑树,可以看做一个下标可以是任意类型的数组. ...

  3. STL初步——集合Set

    『写在前面的一些基础语法』 1.定义 和 赋值 set<int> a={1,2}; set<char> b={"1","2"}; set ...

  4. 单词数 (STL set集合)

    单词数 Problem Description lily的好朋友xiaoou333近期非常空.他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数.以下你的任务是帮助xiaoou333解决问 ...

  5. 【C++ 与 STL】集合:set

    方法: begin() 返回指向第一个元素的迭代器 clear() 清除所有元素 count() 返回某个值元素的个数 empty() 如果集合为空,返回true(真) end() 返回指向最后一个元 ...

  6. [C++STL]常用集合算法

    代码如下: #include <iostream> #include <vector> #include <numeric> #include <algori ...

  7. BZOJ3578:GTY的人类基因组计划2(集合hash,STL)

    Description GTY召唤了n个人来做实验,GTY家的房子很大,有m个房间一开始所有人都在1号房间里,GTY会命令某人去某个房间等待做实验,或者命令一段区间的房间开始实验,实验会获得一些实验信 ...

  8. 结合泛型与模板的STL.NET

    开始之前,先来看一个笑话,当问一个C++程序员怎样完成一个给定的任务时,他(她)可能会提供一打或更多的潜在解决方案列表,但又会极其详细地标出每种方案的问题之处,让你不知所措,难以选择.而Visual ...

  9. C++STL常用算术生成算法

    C++STL常用集合算法 学习目标 注意 算法简介 accumulate 功能描述 函数原型 示例 总结 fill 功能描述 函数原型 示例 总结 学习目标 掌握常用的算术生成算法 注意 算术生成算法 ...

最新文章

  1. PK3Err0040: The target device is not ready for debugging. Please check your configuration bit settin
  2. Xcode自定义字体不能应用的原因
  3. ps命令使用 进程查看
  4. 电话光端机的电话业务不通问题,该怎么去检查?
  5. android xml正方形,使用Android Constraintlayout创建一排均匀分布的正方形
  6. java代码限制短信发送次数_java如何实现发短息限制日发送次数代码
  7. php转go注意,PHP转Golang一些感想
  8. Linux中usb设置burst,Re: 关于IMX6UL第二个USB接口在linux驱动的问题
  9. Three20 NetWork
  10. 用ffmpeg快速剪切和合并视频
  11. php --- 二维码生成代码
  12. 【洛谷】P3369 【模板】普通平衡树
  13. nodejs addon实现回调函数事件
  14. docker具名挂载与匿名挂载
  15. linux安装Oracle11g详细教程(redhat6、Centos7)
  16. VTK和numpy的整合
  17. 51单片机三线串行驱动12864液晶
  18. 黑龙江职业学院计算机考试,黑龙江职业学院官网
  19. CHP城市猎人系统开发
  20. java实现第七届蓝桥杯搭积木

热门文章

  1. yum install rpm包时报错
  2. 发送邮件 (Send Email)
  3. linux 下一条命令查出arp
  4. python 复数幂_python基础学习——运算符(1)
  5. 人人开源项目文档_为什么图对于您的开源项目文档至关重要
  6. h5海报设计开源工具_5个用于教幼儿阅读的开源工具
  7. 如何使用PerfSONAR测试网络
  8. SLAM GMapping(6)扫描匹配器
  9. php7 mcrypt模块_如何在php7.2/php7.3中安装mcrypt扩展?
  10. python画图x轴丢值_python-从pyplot绘图中擦除先前绘制的内容