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 实践场景 订单支付失败,每隔一段时间提醒用户 用户并发量的情况,可以 ...
随机推荐
- PHP实现长网址与短网址
原文地址:http://www.qqdeveloper.com/detail/29/1.html 什么是长链接.短链接 顾名思义,长链接就是一个很长的链接:短链接就是一个很短的链接.长链接可以生成短链 ...
- nodejs的安装配置
Node.js安装及环境配置 一.安装环境 1.本机系统:Windows 10 Pro(64位)2.Node.js:v6.9.2LTS(64位) 二.安装Node.js步骤 1.下载对应你系统的N ...
- python3 练习题100例 (三)
题目三:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? #!/usr/bin/env python3 # -*- coding: utf-8 -*- &qu ...
- 初识主席树_Prefix XOR
主席树刚接触觉得超强,根本看不懂,看了几位dalao的代码后终于理解了主席树. 先看一道例题:传送门 题目大意: 假设我们预处理出了每个数满足条件的最右边界. 先考虑暴力做法,直接对x~y区间暴枚,求 ...
- 天津Uber优步司机奖励政策(12月14日到12月20日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- Redis系列一 Redis安装
Redis系列一 Redis安装 1.安装所使用的操作系统为Ubuntu16.04 Redis版本为3.2.9 软件一般下载存放目录为/opt,以下命令操作目录均为/opt root@ubunt ...
- Farpoint使用一点小总结
Farpoint表格编辑的功能是非常强大的,记录下自己常用到的地方. 使用的版本:FarPoint.Win.Spread.5.0 1.Farpoint 设置为不可编辑状态 this.FPProxyIt ...
- HTTP与IIS知识点
HTTP TCP/IP 使用的网络是在TCP/IP协议族的基础上运作的.HTTP属于它内部的一个子集. 协议:计算机与设备要互相通信,双方就必须基于相同的方法.这种规则称为协议(protocol) 分 ...
- 第十五届北京师范大学程序设计竞赛现场决赛题解&源码(A.思维,C,模拟,水,坑,E,几何,思维,K,字符串处理)
#include <bits/stdc++.h> using namespace std; int main() { int T,n,a,b; while(cin>>T) { ...
- 「赛后补题」Meeting(HDU-5521)
题意 A,B两个人分别在1和n区.每个区有若干点(区之间的点可以重复,各个区内点间的距离一致),给出区之间有联系的图以及到达所需时间.求两个人见面最短时间以及在哪个区碰面(可有多个) 分析 隐式图搜索 ...