C++ 学习笔记之 STL 队列
一. 引言
在算法以及数据结构的实现中,很多地方我们都需要队列(遵循FIFO,先进先出原则)。
为了使用队列,我们可以自己用数组来实现队列,但自己写太麻烦不说,并且还很容易出错。
好在C++的STL(标准模板库)为我们实现了一个强大的队列,它包含在头文件<queue>中。
二. queue
a) 构造函数
下面用例子来展示queue的构造函数
deque<int> deck(,); list<int> mylist(,); queue<int> first;//默认构造 queue<int,list<int> > second(mylist);//以list为容器构造 queue<int> third(mylist);//以deque为容器构造,其中deque是queue的默认容器 queue<int,deque<int> > forth(mylist);//用默认容器构造,deque是queue的默认容器
我们可以使用deque(双端队列容器)或者list(链表容器)来作为queue的基础容器(underlying container,即队列是在基础容器的基础上实现的),其中deque是默认使用的,如果没有在参数中特殊指定,那么queue就使用deque作为基础容器。
b) 其他成员函数
- empty 测试容器是否为空,为空时返回true
- size 返回容器的大小
- front 返回队列的第一个元素,即最早被压进队列的元素
- back 返回队列的最后一个元素,即最晚被压进队列的元素
- push 把元素添加至队列尾
- pop 弹出队列首元素
- swap(C++11) 交换两个队列
- emplace(C++11) 在容器中直接构造元素,可以参考C++11新特性emplace操作
三. priority_queue(优先队列)
a) 构造函数
#include <cstdio>
#include <queue>
#include <cstdlib>
#include <iostream>
#include <ctime>
#include <functional>
using namespace std;
struct Node{
int a ;
Node(int a):a(a){}
};
struct mycomparision{
bool reverse;
mycomparision(const bool &revparam=false){
reverse = revparam;
}
bool operator () (const int & lhs, const int &rhs) const {
if(reverse)return (lhs > rhs);//升序
else return (lhs < rhs);//降序
}
};
struct cmp{
bool operator () (const Node a, const Node b) const{
return a.a < b.a;//小于号代表降序输出
}
};
int main(){
int myints[] = {,,,};
priority_queue<int> zero;
priority_queue<Node,vector<Node>,cmp> first;//自定义结构体的优先队列,降序输出
for(int c : myints){
first.push(Node(c));
}
priority_queue<int,vector<int>,mycomparision> second(myints,myints+,mycomparision(true));//与自定义的仿函数mycomparision结合实现自定义排序功能
priority_queue<int,vector<int>,mycomparision> third(myints,myints+,mycomparision());
priority_queue<int,vector<int>,mycomparision> forth(myints,myints+);//输出结果同third
priority_queue<int,vector<int>,less<int>> fifth(myints,myints+);//结果同third,less使队列优先输出小数,此为默认,即less<int>可以省略
priority_queue<int,vector<int>,greater<int>> sixth(myints,myints+);//使用functional库中的仿函数greater使队列优先输出小数
while(!first.empty()){
cout << first.top().a << " ";
first.pop();
}
cout << endl;
while(!second.empty()){
cout << second.top() << " ";
second.pop();
}
cout << endl;
while(!third.empty()){
cout << third.top() << " ";
third.pop();
}
cout << endl;
while(!forth.empty()){
cout << forth.top() << " ";
forth.pop();
}
cout << endl;
while(!fifth.empty()){
cout << fifth.top() << " ";
fifth.pop();
}
cout << endl;
while(!sixth.empty()){
cout << sixth.top() << " ";
sixth.pop();
}
return ;
}
优先队列内部维持了堆。利用堆来实现随机的
我们可以使用deque(双端队列容器)或者vector(向量容器)来作为priority_queue的基础容器,其中vector是默认使用的,如果没有在参数中特殊指定,那么queue就使用vector作为基础容器。
这里还要特别注意仿函数的使用。在头文件<functional>提供了一部分仿函数,我们可以利用这些仿函数来实现对基本数据类型的升序降序操作。但对于自定义的结构体类型,我们需要自己额外来实现仿函数来进行排序。有关仿函数的概念可以参考博客:【C++ STL】深入解析神秘的 --- 仿函数
b) 其他成员函数
priority_queue的成员函数与queue大体一致,其中需要注意的是:
- top取代了原来的front,每次取特定排序规则中的具有最值的元素
- 取消了back函数
以上是我自己查资料总结的队列的一些用法,如有不对之处还望各位斧正。
C++ 学习笔记之 STL 队列的更多相关文章
- Linux进程间通信IPC学习笔记之消息队列(SVR4)
Linux进程间通信IPC学习笔记之消息队列(SVR4)
- 学习笔记:STL
第一部分:(参考百度百科) 一.STL简介 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.它是由Alexander Stepanov.Me ...
- Redis学习笔记~实现消息队列比MSMQ更方便
什么是队列:简单的说就是数据存储到一个空间里(可以是内存,也可以是物理文件),先存储的数据对象,先被取出来,这与堆栈正好相反,消息队列也是这样,将可能出现高并发的数据进行队列存储,并按着入队的顺序依次 ...
- Linux进程间通信IPC学习笔记之消息队列(Posix)
基础知识: 消息队列可认为是一个消息链表,有足够写权限的线程可往队列中放置消息,有足够读权限的线程可以从队列中取走消息.在某个进程往一人队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达. ...
- PetShop 4.0学习笔记:消息队列MSMQ
直到今天才知道,在我们每天都在用的Window系统里还有这么好用的一个编程组件:消息队列.它能够解决在大数据量交换的情况下的性能问题,特别是BS系统的数据库性能.而且它的异步处理方式能给程序员最大的便 ...
- Linux学习笔记28——消息队列
一 关于消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法,而且,每个数据块都被认为含有一个类型,接收进程可以独立地接受含有不同类型值的数据块.可以通过发送消息来几乎完全避免命名管 ...
- redis 学习笔记三(队列功能)
Redis队列功能介绍 List 常用命令: Blpop删除,并获得该列表中的第一元素,或阻塞,直到有一个可用 Brpop删除,并获得该列表中的最后一个元素,或阻塞,直到有一个可用 Brpoplpus ...
- 【学习笔记】tensorflow队列和线程
目录 Tensorflow队列 同步执行队列 队列管理器 异步执行队列 线程协调器 在使用TensorFlow进行异步计算时,队列是一种强大的机制. 为了感受一下队列,让我们来看一个简单的例子.我们先 ...
- Redis学习笔记之延时队列
目录 一.业务场景 二.Redis延时队列 一.业务场景 所谓延时队列就是延时的消息队列,下面说一下一些业务场景比较好理解 1.1 实践场景 订单支付失败,每隔一段时间提醒用户 用户并发量的情况,可以 ...
随机推荐
- Ajax实现下载进度条
可以通过设置一个XMLHttpRequest对象的 responseType 属性来改变一个从服务器上返回的响应的数据类型.可用的属性值为空字符串 (默认), "arraybuffer&qu ...
- 端午节佳节从CSDN博客搬家来这,请多多指教
端午节佳节从CSDN博客搬家来博客园,请多多指教
- day 23 模块2
1.namedtuple 命名元组 -> 类似创建一个类 from collections import namedtuple # 类 p = namedtuple("P ...
- 解决gradle下载慢的问题(转)
问题一:新建项目下载gradle慢的问题 解决方法: 打开用户主目录 linux平台/home/用户名/.gradle windows平台c:\Users\用户名\.gradle macos平台/Us ...
- hadoop生态搭建(3节点)-12.rabbitmq配置
# 安装 需要相关包# ==================================================================node1 node2 node3 yum ...
- consonant_摩擦音
consonant_摩擦音_[t∫].[dʒ].[tr].[dr].[ts].[dz] 破擦音:即有爆破音又有摩擦音. [t∫]:噘嘴,舌尖抵住上牙龈,舌头下切,用一瞬间的气流发出声音,不震动. ch ...
- docker 环境下创建 overlay 网络方案
一.环境 三台机器,其中一台安装 consul(192.168.1.21), 两台创建网络(192.168.1.32,33) 二.实现步骤 1.构建环境 1)三台机器部署docker环境 2)选择一台 ...
- Address already in use: JVM_Bind,tomcat启动异常
严重: StandardServer.await: create[8050]: java.net.BindException: Address already in use: JVM_Bind tom ...
- SQl 语句 表的连接
当涉及到多个表查询时就需要使用将表连接的方法进行查询. SQL语句连接的方式根本上分为5种: •EQUI JOIN •SEMI JOIN 3 •ANTI JOIN 4 •CROSS JOIN •DIV ...
- Android:Gradle报错——No resource found that matches the given name (at 'dialogCornerRadius' with value '?android:attr/dialogCornerRadius')
今天在使用科大讯飞语音识别SDK进行语音识别功能实现时,莫名的引入了这个错误.不得不吐槽Android Studio再引入别的包时太容易出现冲突,然后导致无法找到R文件,项目无法执行. 1. 具体报错 ...