一.  引言

  在算法以及数据结构的实现中,很多地方我们都需要队列(遵循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)     其他成员函数

  1. empty 测试容器是否为空,为空时返回true
  2. size 返回容器的大小
  3. front 返回队列的第一个元素,即最早被压进队列的元素
  4. back 返回队列的最后一个元素,即最晚被压进队列的元素
  5. push 把元素添加至队列尾
  6. pop 弹出队列首元素
  7. swap(C++11) 交换两个队列
  8. 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大体一致,其中需要注意的是:

  1. top取代了原来的front,每次取特定排序规则中的具有最值的元素
  2. 取消了back函数

以上是我自己查资料总结的队列的一些用法,如有不对之处还望各位斧正。

C++ 学习笔记之 STL 队列的更多相关文章

  1. Linux进程间通信IPC学习笔记之消息队列(SVR4)

    Linux进程间通信IPC学习笔记之消息队列(SVR4)

  2. 学习笔记:STL

    第一部分:(参考百度百科) 一.STL简介 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.它是由Alexander Stepanov.Me ...

  3. Redis学习笔记~实现消息队列比MSMQ更方便

    什么是队列:简单的说就是数据存储到一个空间里(可以是内存,也可以是物理文件),先存储的数据对象,先被取出来,这与堆栈正好相反,消息队列也是这样,将可能出现高并发的数据进行队列存储,并按着入队的顺序依次 ...

  4. Linux进程间通信IPC学习笔记之消息队列(Posix)

    基础知识: 消息队列可认为是一个消息链表,有足够写权限的线程可往队列中放置消息,有足够读权限的线程可以从队列中取走消息.在某个进程往一人队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达. ...

  5. PetShop 4.0学习笔记:消息队列MSMQ

    直到今天才知道,在我们每天都在用的Window系统里还有这么好用的一个编程组件:消息队列.它能够解决在大数据量交换的情况下的性能问题,特别是BS系统的数据库性能.而且它的异步处理方式能给程序员最大的便 ...

  6. Linux学习笔记28——消息队列

    一 关于消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法,而且,每个数据块都被认为含有一个类型,接收进程可以独立地接受含有不同类型值的数据块.可以通过发送消息来几乎完全避免命名管 ...

  7. redis 学习笔记三(队列功能)

    Redis队列功能介绍 List 常用命令: Blpop删除,并获得该列表中的第一元素,或阻塞,直到有一个可用 Brpop删除,并获得该列表中的最后一个元素,或阻塞,直到有一个可用 Brpoplpus ...

  8. 【学习笔记】tensorflow队列和线程

    目录 Tensorflow队列 同步执行队列 队列管理器 异步执行队列 线程协调器 在使用TensorFlow进行异步计算时,队列是一种强大的机制. 为了感受一下队列,让我们来看一个简单的例子.我们先 ...

  9. Redis学习笔记之延时队列

    目录 一.业务场景 二.Redis延时队列 一.业务场景 所谓延时队列就是延时的消息队列,下面说一下一些业务场景比较好理解 1.1 实践场景 订单支付失败,每隔一段时间提醒用户 用户并发量的情况,可以 ...

随机推荐

  1. 多用户OFDM系统资源分配研究

    首先,OFDMA 是什么? OFDM 技术的基本原理是将无线信道划分为若干互相正交的子信道,把高速串行数据流转化为低速并行子数据流,低速并行子数据流在子信道上独立传输. OFDMA 是LTE的下行多址 ...

  2. 原生JS实现移动端的轮播效果

    首先 我们想实现的效果是在手指按下拖动的时候图片能够跟随移动(无动画效果)然后松开手指后判断图片移动的位置 和某一个值进行比较 在这里我们默认定为盒子的1/3宽度 当x轴的移动位置大于1/3的时候图片 ...

  3. JavaScript脚本加载相关知识

    <script>标签的位置 HTML4规范允许<script>可以放在<head>或<body>中. 但是,放在<head>中会导致性能问题 ...

  4. 企业IT架构转型之道 读后感

    放假三天,用部分时间阅读了企业IT架构转型之道这本书.第一遍潦草读完,就感觉收益颇多.这本书值得多读几遍,适合精度. 作为银行IT开发人员,在央企IT成本部门的大背景下,开发过程中遇到的诸多疑惑.困惑 ...

  5. yii学习笔记(6),数据库操作(增删改)

    数据库增删改操作通过活动记录实例来完成 插入记录 /* ----------添加记录---------- */ // 创建活动记录对象 $article = new Article(); $artic ...

  6. JAVA 使用Comparator接口实现自定义排序

    1.原则 Comparator接口可以实现自定义排序,实现Comparator接口时,要重写compare方法: int compare(Object o1, Object o2) 返回一个基本类型的 ...

  7. 5、GDB调试工具的使用

    GDB是GNU发布的一款功能强大的程序调试工具.GDB主要完成下面三个方面的功能: 1.启动被调试程序. 2.让被调试的程序在指定的位置停住. 3.当程序被停住时,可以检查程序状态(如变量值). #i ...

  8. win10每次重新启动,eclipse不能打开,要重新配jdk环境的解决办法

    在后面加上反斜杠就好,也不知道是什么原因,知道的同学希望可以在下面的评论告诉我.

  9. STL---llist

    #include<iostream> #include<algorithm> #include<list> using namespace std; struct ...

  10. nmap教程(上)

    一.nmap的主要功能 1.端口扫描 2.主机探测:查找目标网络的在线主机 3.服务/版本检测:发现开放端口后,进一步检测目标主机的检测服务协议.应用程序名称.版本号等信息 4.操作系统检测 5.网络 ...