【C++ STL容器适配器】queue 队列

本文详细介绍了STLqueue容器适配器的基本原理,展示了如何使用deque和list创建queue,以及queue支持的成员函数如empty(),size(),front(),back(),push(),pop()等。还讨论了队列的初始化方式和元素访问方法。
摘要由CSDN通过智能技术生成

【 1. 基本原理 】

  • STL queue 容器适配器 模拟的就是 队列 这种存储结构,因此对于任何需要用队列进行处理的序列来说,使用 queue 容器适配器都是好的选择。
  • 和 stack 栈容器适配器不同,queue 容器适配器有 2 个开口, 其中一个开口专门用来输入数据,另一个专门用来输出数据,如下图所示。
    在这里插入图片描述
  • 这种存储结构最大的特点是,最先进入 queue 的元素,也可以最先从 queue 中出来,即用此容器适配器存储数据具有 先进先出(First In First Out,FIFO)的特点,因此 queue 又称为队列适配器。

【 1. queue 的创建 】

  • queue 容器适配器以模板类 queue<T,Container=deque<T>>(其中 T 为存储元素的类型,Container 表示底层容器的类型)的形式位于 <queue>头文件 中,并定义在 std 命名空间 里。

2.1 使用默认的 deque 基础容器创建一个空的 queue

  • 创建一个可存储 int 类型元素,底层采用 deque 容器的 queue 容器适配器。
queue<int> values;

2.2 指定基础容器创建 queue

  • 可以手动指定 queue 容器适配器底层采用的基础容器类型,基础容器存储的 数据类型 必须和 queue 容器适配器存储的元素类型保持一致
    • 作为 queue 容器适配器的基础容器,其必须提供 front()、back()、push_back()、pop_front()、empty() 和 size() 这几个成员函数,符合条件的序列式容器仅有 deque 和 list。
queue<int, list<int>> values;
queue<int, deque<int>> values;

2.3 通过基础容器来初始化 queue

  • 可以用基础容器来初始化 queue 容器适配器,只要该 基础容器类型和 queue 底层使用的基础容器类型相同即可。例如:
    • 由于 my_queue 底层采用的是 deque 容器,和 values 类型一致,且存储的也都是 int 类型元素,因此可以用 values 对 my_queue 进行初始化。
deque<int> values{1,2,3};
queue<int> my_queue(values);

2.4 通过一个 queue 初始化另一个 queue

  • 还可以直接通过 queue 容器适配器来初始化另一个 queue 容器适配器,只要它们 存储的元素类型以及底层采用的基础容器类型相同 即可。例如:
deque<int> values{1,2,3};
queue<int> my_queue1(values);

queue<int> my_queue(my_queue1);
//或者使用
//queue<int> my_queue = my_queue1;
  • 值得一提的是,第 3、4 种方法中 my_queue 容器适配器的数据是经过拷贝得来的,也就是说,操作 my_queue 容器适配器中的数据,并不会对 values 容器以及 my_queue1 容器适配器有任何影响;反过来也是如此。

【 3. queue 支持的成员函数 】

  • queue 容器适配器和 stack 有一些成员函数相似,但在一些情况下,工作方式有些不同。
queue 支持的成员函数功能
empty()如果 queue 中没有元素的话,返回 true。
size()返回 queue 中元素的个数。
front()返回 queue 中第一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
back()返回 queue 中最后一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
push(const T& obj)在 queue 的尾部添加一个元素的副本。这是通过调用底层容器的成员函数 push_back() 来完成的。
emplace()在 queue 的尾部直接添加一个元素。
push(T&& obj)以移动的方式在 queue 的尾部添加元素。这是通过调用底层容器的具有右值引用参数的成员函数 push_back() 来完成的。
pop()删除 queue 中的第一个元素。
swap(queue &other_queue)将两个 queue 容器适配器中的元素进行互换,需要注意的是,进行互换的 2 个 queue 容器适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同。
  • queue 没有迭代器,因此访问元素的唯一方式是遍历容器,通过不断移除访问过的元素,去访问下一个元素
  • 实例
#include <iostream>
#include <queue>
#include <list>
using namespace std;
int main()
{
    //构建 queue 容器适配器
    std::deque<int> values{ 1,2,3 };
    std::queue<int> my_queue(values);//{1,2,3}
    //查看 my_queue 存储元素的个数
    cout << "size of my_queue: " << my_queue.size() << endl;
    //访问 my_queue 中的元素
    while (!my_queue.empty())
    {
        cout << my_queue.front() << endl;
        //访问过的元素出队列
        my_queue.pop();
    }
    return 0;
}

在这里插入图片描述

  • 13
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

MR_Promethus

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

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

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

打赏作者

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

抵扣说明:

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

余额充值