C++ STL 之队列(先进先出) queue 详解

Part.I Attention

在这里插入图片描述

  • queue<T>容器适配器的数据是以 FIFO (Fisrt in First Out, 先进先出) 的方式组织的,可以将它想象成等着做核酸的一队人。
  • 必须要包含头文件#include <queue>
  • 头文件queue中不但定义queue,还定义了priority_queue
  • priority_queue<T>:优先队列,它和queue不同的就在于我们可以自定义其中数据的优先级,让优先级高的排在队列前面,优先出队。默认降序,大根堆,队头元素最大。
  • pop()删除队列中的第一个元素,但是什么也不返回。

Part.II Funciton

Chap.I queue

queue 对象很简单,它只有9个函数,如下图所示:

在这里插入图片描述

下面是对各个函数的说明:

函数解释
front()返回 queue 中第一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
back()返回 queue 中最后一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
push(const T& obj)在 queue 的尾部添加一个元素的副本。这是通过调用底层容器的成员函数 push_back() 来完成的。
push(T&& obj)以移动的方式在 queue 的尾部添加元素。这是通过调用底层容器的具有右值引用参数的成员函数 push_back() 来完成的。
pop()删除 queue 中的第一个元素,什么也不返回。
size()返回 queue 中元素的个数。
empty()如果 queue 中没有元素的话,返回 true。
emplace()用传给 emplace() 的参数调用 T 的构造函数,在 queue 的尾部生成对象。
swap(queue<T> &other_q)将当前 queue 中的元素和参数 queue 中的元素交换。它们需要包含相同类型的元素。也可以调用全局函数模板 swap() 来完成同样的操作。

Chap.II priority_queue

priority_queue 对象和queue对象的函数不尽相同,它的函数有点类似与堆栈的函数,如下:

函数含义
push(const T& obj)将obj的副本放到容器的适当位置,这通常会包含一个排序操作。
push(T&& obj)将obj放到容器的适当位置,这通常会包含一个排序操作。
emplace(T constructor a rgs...)通过调用传入参数的构造函数,在序列的适当位置构造一个T对象。为了维持优先顺序,通常需要一个排序操作。
top()返回优先级队列中第一个元素的引用。
pop()移除第一个元素。
size()返回队列中元素的个数。
empty()如果队列为空的话,返回true。
swap(priority_queue<T>& other)和参数的元素进行交换,所包含对象的类型必须相同。

Part.III Code

下面是笔者学习此种数据结构所写的简单的示例。

Chap.I queue

完整代码如下:

#include <iostream>
#include <iomanip>
#include <queue>

using namespace std;

int main()
{
    int tmp=0;
    queue<int> que({0,1,2,3});  // queue<int> que;
    queue<int> que1({0,1,2,3}); 
    cout<< que.back() << setw(3) << que.front() <<endl;
    que.push(4);
    que.emplace(5);
    cout<< que.back() << setw(3) << que.front() << setw(3) << que.size() <<endl;
    que.pop();
    cout<< que.back() << setw(3) << que.front() << setw(3) << que.size() <<endl;
    que.swap(que1);
    cout<< que.back() << setw(3) << que.front() << setw(3) << que.size() <<endl;
    getchar();
    return 0;
}

输出如下:

3  0
5  0  6
5  1  5
3  0  4

Chap.II priority_queue

完整代码如下:

#include <iostream>
#include <iomanip>
#include <queue>
#include <vector>

using namespace std;

int main()
{
    int tmp=0;
    string st[]={"one","two","three","four","five","six","seven"};
    priority_queue<string, vector<string>, greater<string>> pq;  // priority_queue<string> que;
    priority_queue<string, vector<string>, greater<string>> pq1;
    for(auto& c:st) { pq.push(c); }
    pq1=pq;
    while(!pq.empty()) {
        cout<<pq.top()<<" ";
        pq.pop();
    }
    cout<<endl;
    cout<<setw(3)<<pq.size()<<setw(3)<<pq1.size()<<endl;
    pq.swap(pq1);
    cout<<setw(3)<<pq.size()<<setw(3)<<pq1.size()<<endl;
    getchar();
    return 0;
}

输出如下:

five four one seven six three two
  0  7
  7  0

priority_queue的构造函数:

priority_queue<T> p; //默认降序,大根堆,队头元素最大
priority_queue<T, vector<T>, less<T>> p; //相当于默认
priority_queue<T, vector<T>, greater<T>> p; //升序,最小值优先级队列,小根堆
priority_queue<string, vector<string>, greater<string>> pq
  • 第一个参数是一个用来对元素排序的函数对象
  • 第二个参数是一个提供初始元素的容器
  • 第三个参数指定排序的规则

其他的都比较好理解。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
c STL优先队列是一种数据结构,它能够按照一定的优先级来管理元素。引用中提到了一些关于优先队列的使用方法和操作。在C++中,我们可以使用priority_queue模板类来实现优先队列。默认情况下,优先队列是大堆,也就是优先级高的元素是值较大的元素。如果我们想要控制成小堆,也就是优先级高的元素是值较小的元素,我们可以使用priority_queue的第三个参数,即比较函数。引用中的代码示例展示了如何使用priority_queue来创建优先队列,以及如何改变默认的堆顺序。引用中提到,默认情况下,优先队列使用vector作为底层存储数据的容器,并使用堆算法将vector中的元素构造成堆的结构。因此,我们可以在任何需要使用堆的地方考虑使用优先队列。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [C++STL队列以及优先队列小结](https://blog.csdn.net/Hollay/article/details/88677775)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [C++STL之优先级队列详解](https://blog.csdn.net/attemptendeavor/article/details/121914810)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流浪猪头拯救地球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值