C++ 学习笔记之 STL 队列

一.  引言

  在算法以及数据结构的实现中,很多地方我们都需要队列(遵循FIFO,先进先出原则)。

  为了使用队列,我们可以自己用数组来实现队列,但自己写太麻烦不说,并且还很容易出错。

  好在C++的STL(标准模板库)为我们实现了一个强大的队列,它包含在头文件<queue>中。

二.    queue

a)     构造函数

下面用例子来展示queue的构造函数

    deque<int> deck(3,100);

    list<int> mylist(2,100);

    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)     构造函数

 1 #include <cstdio>
 2 #include <queue>
 3 #include <cstdlib>
 4 #include <iostream>
 5 #include <ctime>
 6 #include <functional>
 7 using namespace std;
 8 struct Node{
 9     int a ;
10     Node(int a):a(a){}
11 };
12 struct mycomparision{
13     bool reverse;
14     mycomparision(const bool &revparam=false){
15         reverse = revparam;
16     }
17     bool operator () (const int & lhs, const int &rhs) const {
18         if(reverse)return (lhs > rhs);//升序
19         else return (lhs < rhs);//降序
20     }
21 };
22 struct cmp{
23     bool operator () (const Node a, const Node b) const{
24         return a.a < b.a;//小于号代表降序输出
25     }
26 };
27 int main(){
28     int myints[] = {10,60,50,20};
29     priority_queue<int> zero;
30     priority_queue<Node,vector<Node>,cmp> first;//自定义结构体的优先队列,降序输出
31     for(int c : myints){
32         first.push(Node(c));
33     }
34     priority_queue<int,vector<int>,mycomparision> second(myints,myints+4,mycomparision(true));//与自定义的仿函数mycomparision结合实现自定义排序功能
35     priority_queue<int,vector<int>,mycomparision> third(myints,myints+4,mycomparision());
36     priority_queue<int,vector<int>,mycomparision> forth(myints,myints+4);//输出结果同third
37     priority_queue<int,vector<int>,less<int>> fifth(myints,myints+4);//结果同third,less使队列优先输出小数,此为默认,即less<int>可以省略
38     priority_queue<int,vector<int>,greater<int>> sixth(myints,myints+4);//使用functional库中的仿函数greater使队列优先输出小数
39     while(!first.empty()){
40         cout << first.top().a << " ";
41         first.pop();
42     }
43     cout << endl;
44     while(!second.empty()){
45         cout << second.top() << " ";
46         second.pop();
47     }
48     cout << endl;
49     while(!third.empty()){
50         cout << third.top() << " ";
51         third.pop();
52     }
53     cout << endl;
54     while(!forth.empty()){
55         cout << forth.top() << " ";
56         forth.pop();
57     }
58     cout << endl;
59     while(!fifth.empty()){
60         cout << fifth.top() << " ";
61         fifth.pop();
62     }
63     cout << endl;
64     while(!sixth.empty()){
65         cout << sixth.top() << " ";
66         sixth.pop();
67     }
68     return 0;
69 }

优先队列内部维持了堆。利用堆来实现随机的

我们可以使用deque(双端队列容器)或者vector(向量容器)来作为priority_queue的基础容器,其中vector是默认使用的,如果没有在参数中特殊指定,那么queue就使用vector作为基础容器。

这里还要特别注意仿函数的使用。在头文件<functional>提供了一部分仿函数,我们可以利用这些仿函数来实现对基本数据类型的升序降序操作。但对于自定义的结构体类型,我们需要自己额外来实现仿函数来进行排序。有关仿函数的概念可以参考博客:【C++ STL】深入解析神秘的 --- 仿函数

b)     其他成员函数

priority_queue的成员函数与queue大体一致,其中需要注意的是:

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

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

时间: 2024-10-05 08:15:27

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

STL学习笔记--&gt;初识STL

“这里要用char类型”; “这里要用int类型”; “其实实现这个方法只需要把另一个方法的返回值的类型和传入参数的类型改成float类型就实现了”; “其实这个算法只需要把以前写的那个稍微改动一下就行了”; ……………… 学过面向对象语言的都知道GP这个概念,就是泛型程序设计,说的再明白点就是编写不依赖于具体数据类型的程序,C++作为一门面向对象语言,当然也有泛型这个概念,这就不得不提STL(Standard Template Library,标准模板库),是被融入C++标准程序库里面的一个高

C++学习笔记50:队列类模板

队列是只能向一端添加元素,从另一端删除元素的线性群体 循环队列 在想象中将数组弯曲成环形,元素出队时,后继元素不移动,每当队尾达到数组最后一个元素时,便再回到数组开头. 队列类模板 //Queue.h #ifndef QUEUE_H #define QUEUE_H #include <cassert> //类模板的定义 template <class T, int SIZE = 50> class Queue { private: int front, rear, count; T

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

直到今天才知道,在我们每天都在用的Window系统里还有这么好用的一个编程组件:消息队列.它能够解决在大数据量交换的情况下的性能问题,特别是BS系统的数据库性能.而且它的异步处理方式能给程序员最大的便利与最好的用户体验. 1.首先在需要进行消息队列的服务器上安装MSMQ,我的系统是win2003+iis6,所以这个安装选项在添加删除程序->windows组件->应用程序服务器内.默认是不安装的,需要手动选择. 2.建立消息队列的存放路径.这可以在windows的计算机管理内添加,也可以在程序中

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

什么是队列:简单的说就是数据存储到一个空间里(可以是内存,也可以是物理文件),先存储的数据对象,先被取出来,这与堆栈正好相反,消息队列也是这样,将可能出现高并发的数据进行队列存储,并按着入队的顺序依次处理,实现消息队列的工具有很多,如微软的MSMQ,及一些开源的KV存储工具,今天主要介绍用Redis实现消息队列. 这是我的redis项目结构 redis服务有一个console的程序,可以支持在windows和linux下运行. 我用MVC应用程序来作这个例子,由表单向内存中写信息,然后每5秒中从

学习笔记:单调队列

转自:http://apps.hi.baidu.com/share/detail/34010558 [单调队列]在解一个序列某个区间段的最值问题,我们可以用到单调队列来解决.  比如poj2823 Sliding Window 就是一个很好的例子:给定一个序列,要求序列中固定长度为k 的区间中的最大值和最小值.  [原理]单调队列维护的是区间最值:  1.最大值的维护:          比如我们要维护一个区间为k的最大值的单调队列,由于新插入 的节点他的“生命力”肯定比原先已经在队列中的元素“

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

Redis队列功能介绍 List 常用命令: Blpop删除,并获得该列表中的第一元素,或阻塞,直到有一个可用 Brpop删除,并获得该列表中的最后一个元素,或阻塞,直到有一个可用 Brpoplpush Lindex获取一个元素,通过其索引列表 Linsert在列表中的另一个元素之前或之后插入一个元素 Llen获得队列(List)的长度 Lpop从队列的左边出队一个元素 Lpush从队列的左边入队一个或多个元素 Lpushx当队列存在时,从队到左边入队一个元素 Lrange从列表中获取指定返回的

C++学习笔记之STL标准库(二)algorithm头文件即算法

#include <algorithm> algorithm头文件中主要包含的是一大堆模板函数,即STL库提供的算法,可以认为每个函数在很大程度上是独立的.提供的算法种类有: 1)adjacent_find //检测区间内第一对相等的相邻元素 template<class FwIt> FwIt adjacent_find(FwdIt first,FwdIt last);   //如果成功,返回first+N,N满足*(first+N) == *(first+N+1):如果不存在相等

C++学习笔记之STL标准库(八)queue容器适配器

容器适配器并没有直接维护被控序列,而是通过它里面存储的底层容器对象来实现所有的功能. queue类允许在底层数据结构的末尾插入元素,也允许从前面插入元素(先入先出). 包含头文件 #include<queue>  声明命名空间 using namespace std; 常见的queue操作: 1.void push(const T& val); //在队列末尾插入元素(通过调用底层容器的push_back函数实现) 2.void pop(); //在队列前面删除元素(通过调用底层容器的

C++学习笔记之STL标准库(四)list

模板类list是一个容器,所控制的长度N的序列是一个有着N个节点的双向链表.每个节点存储一个单独的元素,一个前驱指针,一个后继指针.list的节点存储在非连续的存储空间中,由于其结构的原因,list的插入.删除.替换等操作速度很快,但元素的查找和随机存取等操作就很慢,需要从头节点一个节点一个节点的往下查找. 包含头文件 #include<list>  声明命名空间 using namespace std; 1)构造函数 list(); //声明一个空的列表,如:list<int>