C++ queue 详细介绍
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 详细介绍相关推荐
- [转]详细介绍java中的数据结构
详细介绍java中的数据结构 本文介绍的是java中的数据结构,本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类.一起来看本文吧! 也许你已经熟练使用了java.util包里面的各 ...
- uploadify插件可选参数的详细介绍
uploadify插件可选参数的详细介绍 以下是可选项的参数说明:(红色的属性代表常用的) 1 uploader 上传控件的主体文件,flash控件 默认值='uploadify.swf' 2 ...
- RabbitMQ学习总结(一)——基础概念详细介绍
2019独角兽企业重金招聘Python工程师标准>>> 一.基础概念详细介绍 1.引言 你是否遇到过两个(多个)系统间需要通过定时任务来同步某些数据?你是否在为异构系统的不同进程间相 ...
- MQ(Message Queue)介绍
MQ(Message Queue)介绍 文章目录 MQ(Message Queue)介绍 MQ优缺点 RocketMQ常规协议 RocketMq快速入门 基本概念 系统架构 Producer Cons ...
- Apache Kafka 入门 - Kafka命令详细介绍
Apache Kafka 入门 Apache Kafka 入门大概分为5篇博客,内容都比较基础,计划包含以下内容: Kafka的基本配置和运行 Kafka命令详细介绍 Kafka-manager的基本 ...
- Scala语言超详细介绍(上)
Scala语言 1.为什么要学习scala? 2.scala的介绍 3.scala语言和Java语言对比 4.编译工具的安装 5.main方法讲解 6. scala中的数据数据类型 7. 懒加载 8. ...
- Android消息机制(Handler、MessageQueue、Looper)详细介绍
Android的消息机制其实在android的开发过程中指的也就是Handler的运行机制,这也就引出了android中常见的面试问题: 简述Handler.Looper.MessageQueue的含 ...
- ES6详细介绍及使用
ES6详细介绍及使用 一. ES6概念及发展史 1.ES6概念 以前学习JavaScript的时候,对ES5是有了解过的,但是在学习Vue的时候,就会发现有很多新的写法是ES6中的,真是让人捉急.所以 ...
- HTML页面加载和解析流程详细介绍
浏览器加载和渲染html的顺序.如何加快HTML页面加载速度.HTML页面加载和解析流程等等,在本文将为大家详细介绍下,感兴趣的朋友不要错过 浏览器加载和渲染html的顺序 1. IE下载的顺序是从上 ...
最新文章
- Android发展Singleton模式
- python语言入门m-Python学习基础篇 -1
- android中点击按钮弹出一个编辑框,本人是在Button的基础上加了Dialog,Dialog添加了一个编辑框,怎么将Button上的显示文字变成...
- VTK:PolyData之MergeSelections
- 一张PDF了解JDK9 GC调优秘籍-附PDF下载
- eas库存状态调整单不能反审核_订单少了,库存多了,利润没了……
- 正确使用和理解C#中的闭包
- 反射--Class获得
- 如何拉取公网RTSP/RTMP流在内网多客户端播放
- 什么水平的java工程师月薪3万起?
- 我对骨骼动画的理解(最精减的骨骼动画类)
- 2019软件设计师考试要点
- 简单的遗传算法实例(MATLAB版)
- 算法交易:华尔街怪兽的核武器
- 论文格式修改之英文摘要
- vivado添加设计源文件
- GPS导航电文——第四、五子帧数据解析
- TED-4-美好人生的定义
- 主机屋虚拟主机php版本,5款免费虚拟主机管理系统(云虚拟主机管理)
- 无线突然断开无法连接服务器,为什么我的无线网突然就断了 随后怎么也连不上...