一.  引言

  在算法以及数据结构的实现中,很多地方我们都需要队列(遵循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. PHP中级程序员常见面试题

    1).写一个函数,从一个标准url里取出文件的扩展名,需要取出php或.php <?php $a="http://www.test.com.cn:88/abc/de/fg.php?id ...

  2. 记一次MySQL中Waiting for table metadata lock问题的处理

    起因:由于需要,要把一张表的一个字段从不是 null 改成 可null,我用的Navicat Premium ,但是在保存的时候,工具无响应了,几个同事操作都是这样的,很奇怪,怀疑是不是由于表被锁了还 ...

  3. JQuery制作网页——第八章 使用jQuery操作DOM

    1.DOM操作: DOM操作分为三类: ●DOM Core:任何一种支持DOM的编程语言都可以使用它,如getElementById().getElementsByName: ●HTML-DOM:用于 ...

  4. JAVA中判断年月日格式是否正确(支持判断闰年的2月份)

    一.先说一下年月日(yyyy-MM-dd)正则表达式: 1.年月日正则表达式:^((19|20)[0-9]{2})-((0?2-((0?[1-9])|([1-2][0-9])))|(0?(1|3|5| ...

  5. 视频网站数据MapReduce清洗及Hive数据分析

    一.需求描述 利用MapReduce清洗视频网站的原数据,用Hive统计出各种TopN常规指标: 视频观看数 Top10 视频类别热度 Top10 视频观看数 Top20 所属类别包含这 Top20 ...

  6. reids同步机制和远程连接

    RDB同步机制: 开启和关闭:默认情况下是开启了.如果想关闭,那么注释掉redis.conf文件中的所有save选项就可以了. 同步机制: save 900 1:如果在900s以内发生了1次数据更新操 ...

  7. 863. All Nodes Distance K in Binary Tree

    /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...

  8. vim 版本更新

    sudo add-apt-repository ppa:jonathonf/vim sudo apt update sudo apt install vim 如果您想要卸载它, 请使用如下命令 sud ...

  9. ONTAK 2010 aut

    Autostrady https://szkopul.edu.pl/problemset/problem/f2dSBM7JteWHqtmVejMWe1bW/site/?key=statement 题意 ...

  10. Calendar 实现日历实例

    import java.text.ParseException; import java.util.Calendar; import java.util.GregorianCalendar; impo ...