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 实践场景 订单支付失败,每隔一段时间提醒用户 用户并发量的情况,可以 ...
随机推荐
- Linux磁盘管理和lvm
磁盘管理 硬盘接口和硬盘种类 从整体的角度上,硬盘接口分为IDE.SATA.SCSI和SAS四种,IDE接口硬盘多用于家用产品中,也部分应用于服务器,SCSI接口的硬盘则主要应用于服务器市场,而SAS ...
- 误操作yum导致error: rpmdb解决方法
错误:[root@test ~]# yum makecache error: rpmdb: BDB0113 Thread/process 18967/139716328294400 failed: B ...
- echarts 多图任意布局案例
随着文档的更新,布局越来越个性化,完全可以替代整个元素界面,随意布局展示数据,下面发布一个小的文件 源码文件:https://files.cnblogs.com/files/mobeisanghai/ ...
- Linux awk基础笔记
正则表达式含义与构成:用单个字符串来描述或者匹配一系列符合某个句法规则的字符串,一般是由普通字符与特殊字符组成 awk 选项 '模式或者命令{编辑指令}' 文件名 awk '//{print}' aw ...
- Java Web项目里 classpath 具体指哪个路径
classpath路径指什么 只知道把配置文件如:mybatis.xml.spring-web.xml.applicationContext.xml等放到src目录(就是存放代码.java文件的目录) ...
- php 将富文本编辑后的内容取出
背景:项目中用了富文本编辑器,讲写完的内容存入了数据库,但是取出的时候因为有些展示地方并不需要样式,只想获取到内容,所以需要将带了html编码的信息解析出来. 原始信息如下 [task_desc] = ...
- 【 es搜索】
地图搜索实现: ①参数: 左下角经纬度和右上角经纬度 图层数(zoom) 关键字等各种数据库中的字段 排序方式 具体的坐标点+距离 ②实现 a.用es作为关系库,首先先mapping所有的字段,然后用 ...
- 『Linux基础 - 2 』操作系统,Linux背景知识和Ubuntu操作系统安装
这篇笔记记录了以下几个知识点: 1.目前常见的操作系统及分类,虚拟机 2.Linux操作系统背景知识,Windows和Linux两个操作系统的对比 3.在虚拟机中安装Ubuntu系统的详细步骤 OS( ...
- PAT A1060 (Advanced Level) Practice
If a machine can save only 3 significant digits, the float numbers 12300 and 12358.9 are considered ...
- 回顾爬虫的时候的一些小TIPS
1 json.dumps的时候默认会用ascii 所以在写入文件的时候会需要用到的指令变为json.dumps(a,ensuer_ascii=False),这样将禁止转换为ascii 然后再写入的时候 ...