ACM-ICPC模板


#include<queue>

头文件queue里包含了循环队列queuequeuequeue和优先队列priority_queuepriority\_queuepriority_queue

一、循环队列queuequeuequeue

queue<int>q;
  • front():返回 queue 中第一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue
    为空,返回值是未定义的。
  • back():返回 queue 中最后一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue
    为空,返回值是未定义的。
  • push(const T& obj):在 queue 的尾部添加一个元素的副本。这是通过调用底层容器的成员函数 push_back()
    来完成的。
  • push(T&& obj):以移动的方式在 queue 的尾部添加元素。这是通过调用底层容器的具有右值引用参数的成员函数push_back() 来完成的。
  • pop():删除 queue 中的第一个元素。
  • size():返回 queue 中元素的个数。
  • empty():如果 queue 中没有元素的话,返回 true。
  • emplace():用传给 emplace() 的参数调用 T 的构造函数,在 queue 的尾部生成对象。
  • swap(queue<T> &other_q):将当前 queue 中的元素和参数 queue 中的元素交换。它们需要包含相同类型的元素。也可以调用全局函数模板 swap() 来完成同样的操作。

二、优先队列 priority_queuepriority\_queuepriority_queue

1.大根堆

注意priority_queue本身是一个大根堆(堆顶元素值最大,其实就是从大到小排序)

priority_queue<int> q;//大根堆(堆顶值最大)
priority_queue<int,vector<int>,greater<int> > q;//小根堆(堆顶值最小)

注意priority_queue中储存的元素类型必须定义“小于号”(注意这里虽然是<小于号,但实际上是大于号),较大的元素会被放在堆顶。内置的int、string等类型已经定义过“小于号”,若使用结构体则必须重载运算符

由于priority_queue是按照从大到小排序所以重载运算符时也要反过来

重载“<”运算符
下面的poi结构体保存了二维平面上的编号和坐标,比较大小时,先比较横坐标,再比较纵坐标,并考虑了精度误差


struct poi{int id;double x,y;
};
const double eps = 1e-8;
bool operator<(const poi &a,const poi &b){return a.x+eps<b.x||a.x<b.x+eps&&a.y<b.y;
}

2.小根堆

下面代码重载运算符之后定义了一个小根堆(堆顶元素值最小,其实就是从小到大排序)

struct node{int value ;friend bool operator < (node a , node b){return a.value > b.value;}
};
priority_queue<node> q;

或者


struct node{int value ;bool operator < (const node &a) const{return value > a.value;}
};
priority_queue<node> q;

成员函数

q.top();\\访问堆顶元素
q.empty();\\检查是否为空
q.size();\\返回容纳的元素数
q.push();\\插入元素,并排序
q.pop();\\删除栈顶元素

3.懒惰删除法

如果是手写的堆是支持删除任意一个元素,而STL却不支持这种操作所以我们可以用懒惰删除法

懒惰删除法又称延迟删除法,是一种应对策略。当遇到删除操作时,仅在优先队列之外做一些特殊的记录,用于辨别是否堆中的元素被删除。当从堆顶取出元素时判断是否已经被删除,若是,我们重新取一个最值。换言之,元素的“删除”推迟到堆顶执行

比如“堆优化的DijkstraDijkstraDijkstra算法”中当某个元素首次被取出时就达到了最短路,当我们再次取出这个元素时我们不会重新进行扩展,而是使用一个boolboolbool数组判断“是否进行过扩展”,其本质还是懒惰删除法的应用。

三、双端队列dequedequedeque

头文件deque

#include<deque>

双端队列deque支持队列两端高效地插入或删除元素的连续性存储空间。与vector相比,deque在头部增删元素只需要O(1)O(1)O(1),并且deque像数组一样支持下标随机访问。

操作:

[] 随机访问 O(1)O(1)O(1)
begin/end deque的头/尾迭代器O(1)O(1)O(1)
front/back 队头/队尾元素O(1)O(1)O(1)
push_front 从队头入队O(1)O(1)O(1)
push_back 从队尾入队O(1)O(1)O(1)
pop_front 从队头出队O(1)O(1)O(1)
pop_back 从队尾出队O(1)O(1)O(1)
clear 清空队列O(n)O(n)O(n)

C++ queue 详细介绍相关推荐

  1. [转]详细介绍java中的数据结构

    详细介绍java中的数据结构 本文介绍的是java中的数据结构,本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类.一起来看本文吧! 也许你已经熟练使用了java.util包里面的各 ...

  2. uploadify插件可选参数的详细介绍

    uploadify插件可选参数的详细介绍     以下是可选项的参数说明:(红色的属性代表常用的) 1 uploader 上传控件的主体文件,flash控件 默认值='uploadify.swf' 2 ...

  3. RabbitMQ学习总结(一)——基础概念详细介绍

    2019独角兽企业重金招聘Python工程师标准>>> 一.基础概念详细介绍 1.引言 你是否遇到过两个(多个)系统间需要通过定时任务来同步某些数据?你是否在为异构系统的不同进程间相 ...

  4. MQ(Message Queue)介绍

    MQ(Message Queue)介绍 文章目录 MQ(Message Queue)介绍 MQ优缺点 RocketMQ常规协议 RocketMq快速入门 基本概念 系统架构 Producer Cons ...

  5. Apache Kafka 入门 - Kafka命令详细介绍

    Apache Kafka 入门 Apache Kafka 入门大概分为5篇博客,内容都比较基础,计划包含以下内容: Kafka的基本配置和运行 Kafka命令详细介绍 Kafka-manager的基本 ...

  6. Scala语言超详细介绍(上)

    Scala语言 1.为什么要学习scala? 2.scala的介绍 3.scala语言和Java语言对比 4.编译工具的安装 5.main方法讲解 6. scala中的数据数据类型 7. 懒加载 8. ...

  7. Android消息机制(Handler、MessageQueue、Looper)详细介绍

    Android的消息机制其实在android的开发过程中指的也就是Handler的运行机制,这也就引出了android中常见的面试问题: 简述Handler.Looper.MessageQueue的含 ...

  8. ES6详细介绍及使用

    ES6详细介绍及使用 一. ES6概念及发展史 1.ES6概念 以前学习JavaScript的时候,对ES5是有了解过的,但是在学习Vue的时候,就会发现有很多新的写法是ES6中的,真是让人捉急.所以 ...

  9. HTML页面加载和解析流程详细介绍

    浏览器加载和渲染html的顺序.如何加快HTML页面加载速度.HTML页面加载和解析流程等等,在本文将为大家详细介绍下,感兴趣的朋友不要错过 浏览器加载和渲染html的顺序 1. IE下载的顺序是从上 ...

最新文章

  1. Android发展Singleton模式
  2. python语言入门m-Python学习基础篇 -1
  3. android中点击按钮弹出一个编辑框,本人是在Button的基础上加了Dialog,Dialog添加了一个编辑框,怎么将Button上的显示文字变成...
  4. VTK:PolyData之MergeSelections
  5. 一张PDF了解JDK9 GC调优秘籍-附PDF下载
  6. eas库存状态调整单不能反审核_订单少了,库存多了,利润没了……
  7. 正确使用和理解C#中的闭包
  8. 反射--Class获得
  9. 如何拉取公网RTSP/RTMP流在内网多客户端播放
  10. 什么水平的java工程师月薪3万起?
  11. 我对骨骼动画的理解(最精减的骨骼动画类)
  12. 2019软件设计师考试要点
  13. 简单的遗传算法实例(MATLAB版)
  14. 算法交易:华尔街怪兽的核武器
  15. 论文格式修改之英文摘要
  16. vivado添加设计源文件
  17. GPS导航电文——第四、五子帧数据解析
  18. TED-4-美好人生的定义
  19. 主机屋虚拟主机php版本,5款免费虚拟主机管理系统(云虚拟主机管理)
  20. 无线突然断开无法连接服务器,为什么我的无线网突然就断了 随后怎么也连不上...

热门文章

  1. 如何利用Tensorflow和OpenCV构建实时对象识别程序?
  2. 爬虫不得不学之 JavaScript 函数对象篇
  3. Hexo 个人博客 SEO 优化(3):改造你的博客,提升搜索引擎排名
  4. Centos6.2救援模式修改密码
  5. Python 1 数据类型的操作
  6. 微软私有云分享(R2)13 处理孤立资源
  7. Ubuntu13.04下使用dnw
  8. vim设置行号等一系列配置
  9. python一行代码的威力
  10. php下载提示保存,php利用header函数实现文件下载时直接提示保存_php技巧