STL队列 之FIFO队列(queue)、优先队列(priority_queue)、双端队列(deque)
1.FIFO队列
std::queue就是普通意思上的FIFO队列在STL中的模版。
1.1主要的方法有:
(1)T front():访问队列的对头元素,并不删除对头元素
(2)T back():访问队列的末尾元素,并不删除末尾元素
(3)void pop():删除对头元素。
(4)void push(T):元素入队
1.2代码实例
#include <iostream>
#include <queue>
using namespace std;
int main()
{
std::queue<int> myqueue;
myqueue.push(); //入队
myqueue.push();
myqueue.push(); cout<<"队列末尾元素:"<<myqueue.back()<<endl;
cout<<"队列元素出队顺序如下:";
while(!myqueue.empty()) //判空
{
cout<<myqueue.front()<<" "; //访问队列头元素
myqueue.pop(); //队列头元素出对
}
return ;
}
程序输出:
2.优先队列
std::priority_queue就是优先级队列在STL中的模版,在优先队列中,优先级高的元素先出队列,内部使用堆实现(大顶堆,同Top K问题)。
2.1 模版原型:priority_queue<T,Sequence,Compare>
T:存放容器的元素类型
Sequence:实现优先级队列的底层容器,默认是vector<T>
Compare:用于实现优先级的比较函数,默认是functional中的less<T>
2.2主要对方法有:
(1)T top():访问队列的对头元素,并不删除对头元素
(2)void pop():删除对头元素。
(3)void push(T):元素入队
2.3使用默认参数的优先队列实例
#include <iostream>
#include <queue>
int main()
{
std::priority_queue<int> mypq;
mypq.push(); //入队
mypq.push();
mypq.push();
mypq.push();
std::cout << "Popping out elements...";
while (!mypq.empty())
{
std::cout << ' ' << mypq.top(); //读取队列头元素
mypq.pop(); //对头元素出队列
}
std::cout << '\n';
return ;
}
程序输出:
2.4使用自定义的比较函数的优先队列实例
标准库默认使用元素类型的<操作符来确定它们之间的优先级关系,大的优先级高,优先输出。我们只要重写<操作符就可以啦(可以像C语言的qsort()一样,可以写比较复杂的比较函数)。
下面的实例中,重写<操作符,使得数字小的数,优先级大。
#include <iostream>
#include <queue>
#include <vector>
#include <functional>
using namespace std;
struct Node
{
int f;
bool operator<(const Node& node)const
{
return f<node.f? false :true ; //小的数字,可以让它不小
}
};
class cmp
{
public:
bool operator()( const Node & n1, const Node & n2) const
{
return n1<n2; //Node类已经重写了<运算符
}
};
int main()
{
priority_queue< Node,vector<Node>,cmp > q;
Node n1,n2,n3,n4; n1.f = ; n2.f = ;
n3.f = ; n4.f = ; q.push(n1); q.push(n2);
q.push(n3); q.push(n4);
while(!q.empty())
{
cout<< q.top().f<<" ";
q.pop();
}
}
程序输出:
3.双端队列
双端队列就是一个两端都是结尾的队列。队列的每一端都可以插入数据项和移除数据项。deque是STL中双端队列模版。
3.1主要对方法有:
(1)void pop_front():从队列头部删除元素
(2)void pop_back():从队列删除元素
(3)void push_front(T):从队列头部插入元素
(4)void push_back(T):从队列尾部插入元素
(5)T front():读取队列头部元素
(6)T back(T):读取队列尾部元素
3.2代码实例
#include <iostream>
#include <deque> int main ()
{
std::deque<int> mydeque;
mydeque.push_back (); //队列尾部插入
mydeque.push_back ();
mydeque.push_back ();
mydeque.push_front(); //队列头部插入 std::cout << "Popping out the elements in mydeque:";
while (!mydeque.empty())
{
std::cout << ' ' << mydeque.front();
mydeque.pop_front(); //删除队列头部
}
std::cout << "\nThe final size of mydeque is " << int(mydeque.size()) << '\n';
return ;
}
程序输出:
STL队列 之FIFO队列(queue)、优先队列(priority_queue)、双端队列(deque)的更多相关文章
- 06.队列、python标准库中的双端队列、迷宫问题
class QueueUnderflow(ValueError): """队列为空""" pass class SQueue: def __ ...
- python 下的数据结构与算法---4:线形数据结构,栈,队列,双端队列,列表
目录: 前言 1:栈 1.1:栈的实现 1.2:栈的应用: 1.2.1:检验数学表达式的括号匹配 1.2.2:将十进制数转化为任意进制 1.2.3:后置表达式的生成及其计算 2:队列 2.1:队列的实 ...
- HDU 4286 Data Handler --双端队列
题意:有一串数字,两个指针,然后一些添加,删除,反转,以及移动操作,最后输出序列. 解法:可以splay做,但是其实双端队列更简便. 维护三个双端队列LE,MI,RI分别表示[L,R]序列左边,[L, ...
- python中使用双端队列解决回文问题
双端队列:英文名字:deque (全名double-ended queue)是一种具有队列和栈性质的抽象数据类型. 双端队列中的元素可以从两端弹出,插入和删除操作限定在队列的两边进行. 双端队列可以在 ...
- PHP双向队列,双端队列代码
<?php /** * User: jifei * Date: 2013-07-30 * Time: 23:12 */ /** * PHP实现双向队列,双端队列 * 双端队列(dequ ...
- ArrayDeque(JDK双端队列)源码深度剖析
ArrayDeque(JDK双端队列)源码深度剖析 前言 在本篇文章当中主要跟大家介绍JDK给我们提供的一种用数组实现的双端队列,在之前的文章LinkedList源码剖析当中我们已经介绍了一种双端队列 ...
- 2601 电路维修 (双端队列bfs\优先队列bfs(最短路))
描述 Ha'nyu是来自异世界的魔女,她在漫无目的地四处漂流的时候,遇到了善良的少女Rika,从而被收留在地球上.Rika的家里有一辆飞行车.有一天飞行车的电路板突然出现了故障,导致无法启动. 电路板 ...
- 【C++】STL常用容器总结之五:双端队列deque
6.双端队列deque 所谓的deque是”double ended queue”的缩写,双端队列不论在尾部或头部插入元素,都十分迅速.而在中间插入元素则会比较费时,因为必须移动中间其他的元素.双端队 ...
- 队列(Queue)\双端队列(Deque)
队列(Queue)\双端队列(Deque) 队列(Queue) 双端队列(Deque) 算法应用 队列(Queue) 特点: 和栈不同,队列的最大特点是先进先出(FIFO),就好像按顺序排队一样.对于 ...
随机推荐
- MVP模型
MVP模型一般要创建三个文件夹:View.Interactor(Model).Presenter 每个部分都有其接口和实现类,就是为了方便回调 这里做一个登陆界面为例子: 接口: Interactor ...
- 见微知著(一):解析ctf中的pwn--Fast bin里的UAF
在网上关于ctf pwn的入门资料和writeup还是不少的,但是一些过渡的相关知识就比较少了,大部分赛棍都是在不断刷题中总结和进阶的.所以我觉得可以把学习过程中的遇到的一些问题和技巧总结成文,供大家 ...
- CentOS重装grub修复损坏的系统
grub损坏一般有两种情况:第一.安装双系统时,后安装的系统把先安装的系统的MBR删除了.第二.误操作将grub文件删除了. 不管怎样都需要进入到救援模式,详细请看CentOS通过光盘启动救援数据 ( ...
- 你见过这些JavaScript的陷阱吗?
一.成员操作符 Number.prototype.testFn=function () { console.log(this<0, this.valueOf()); } var num = -1 ...
- 1017 Queueing at Bank (25)(25 point(s))
problem Suppose a bank has K windows open for service. There is a yellow line in front of the window ...
- [POI2015]Myjnie
[POI2015]Myjnie 题目大意: 有\(n(n\le50)\)家洗车店从左往右排成一排,每家店都有一个正整数价格\(d_i\). 有\(m(m\le4000)\)个人要来消费,第\(i\)个 ...
- Git 简易使用指南及补充
Git最简易的使用指南 助你开始使用 git 的简易指南,木有高深内容,;) 安装 下载 git OSX 版 下载 git Windows 版 下载 git Linux 版 创建新仓库 创建新文件夹, ...
- SQL Server 无日志文件附加数据库
CREATE DATABASE DBname ON (FILENAME = 'D:\SalesData\DBname_data.mdf') FOR ATTACH_REBUILD_LOG ; GO 简单 ...
- Ajax提交进度显示实例
概述:ajax提交比较大的文件的时候,我们希望能够看到它上传的进度,代码放下面了. <!DOCTYPE html> <html> <head> <meta c ...
- NOIP 2008 传纸条 NOIP 2000 方块取数 多线程DP
思路都是一样,建立一个四维dp然后跑一发就完了 当然,也可以像我这么帅的人,降成三维再傻傻的跑一发啦啦啦~ #include<iostream> #include<stdio.h&g ...