学而时习之:C++中的标准模板库7

C++ STL 中的队列(Queue)

队列(queue)是一种容器适配器,以 FIFO(先进先出)的顺序存储元素。

先插入的元素必须先被移除。

实现方式是在数据结构的一端(称为 back )插入元素,在另一端(称为 front)删除元素。

语法

队列在头文件 <queue> 中被定义为 std::queue 类模板。

cpp 复制代码
queue<T> q;

其中:

  • T:队列中元素的数据类型。
  • q:给队列起的名字。

基本操作

以下是可对队列执行的基本操作:

1. 插入元素

新元素只能在队列尾部(back)通过 push() 函数插入。 该过程也称为"入队(enqueue)"。

插入时间复杂度:O(1)。

cpp 复制代码
#include <iostream>
#include <queue>
using namespace std;

int main()
{
    queue<int> q;

    // 将元素入队
    q.push(3);
    q.push(4);
    q.push(5);

    return 0;
}

2. 访问元素

队列中只有队首(front)和队尾(back)元素可以被访问,分别使用 front()back() 函数。

访问时间复杂度:O(1)。

cpp 复制代码
#include <iostream>
#include <queue>
using namespace std;

int main()
{
    queue<int> q;
    q.push(3);
    q.push(4);
    q.push(5);

    // 访问队首和队尾元素
    cout << q.front() << endl;  // 输出队首
    cout << q.back();           // 输出队尾

    return 0;
}
复制代码
3
5

3. 删除元素

队列中只能从队首(front)通过 pop() 函数删除元素。 该过程也称为"出队(dequeue)"。

删除时间复杂度:O(1)。

cpp 复制代码
#include <iostream>
#include <queue>
using namespace std;

int main()
{
    queue<int> q;
    q.push(3);
    q.push(4);
    q.push(5);

    // 从队首删除一个元素
    q.pop();

    while (!q.empty())
    {
        cout << q.front() << " ";
        q.pop();
    }
    return 0;
}
复制代码
4 5

4. empty()

检查队列是否为空。 若队列中没有任何元素,返回 true;否则返回 false

cpp 复制代码
#include <iostream>
#include <queue>
using namespace std;

int main()
{
    queue<int> q;
    if (q.empty())
    {
        cout << "队列为空" << endl;
    }
    q.push(100);
    if (!q.empty())
    {
        cout << "队列不为空,队首元素: " << q.front() << endl;
    }
    return 0;
}
makefile 复制代码
队列为空
队列不为空,队首元素: 100

5. 队列的大小size

size() 函数返回队列当前存储的元素个数。 该操作不会修改队列内容。

cpp 复制代码
#include <iostream>
#include <queue>
using namespace std;

int main()
{
    queue<int> q;
    q.push(10);
    q.push(5);
    cout << "队列大小: " << q.size() << endl;
    q.pop();
    cout << "队列大小: " << q.size() << endl;
    return 0;
}
makefile 复制代码
队列大小: 2
队列大小: 1

6.伪遍历

由于队列只能访问队首和队尾元素,无法直接对整个队列进行遍历。

变通方法是:创建一个队列的副本,不断访问并弹出副本的队首元素,直到副本为空,即可"遍历"原队列的所有元素。

遍历时间复杂度:O(n)。

cpp 复制代码
#include <iostream>
#include <queue>
using namespace std;

int main()
{
    queue<int> q;
    q.push(3);
    q.push(4);
    q.push(5);

    // 创建原队列的副本
    queue<int> temp(q);

    while (!temp.empty())
    {
        cout << temp.front() << " ";
        temp.pop();
    }
    return 0;
}
复制代码
3 4 5

C++ 中 Queue 所有成员函数

以下是 C++ std::queue 类的全部成员函数列表:

函数 说明
front() 访问队首元素。
back() 访问队尾元素。
empty() 检查队列是否为空。
size() 返回队列中元素个数。
push() 在队尾添加一个元素。
push_range() 在队尾一次性添加多个元素。
emplace() 在队尾原地构造一个元素。
pop() 删除队首元素。
swap() 交换两个队列的内容。
相关推荐
小羊不会打字6 分钟前
CANN 生态中的跨框架兼容桥梁:`onnx-adapter` 项目实现无缝模型迁移
c++·深度学习
Max_uuc15 分钟前
【C++ 硬核】打破嵌入式 STL 禁忌:利用 std::pmr 在“栈”上运行 std::vector
开发语言·jvm·c++
近津薪荼17 分钟前
dfs专题4——二叉树的深搜(验证二叉搜索树)
c++·学习·算法·深度优先
艾莉丝努力练剑1 小时前
【Linux:文件】Ext系列文件系统(初阶)
大数据·linux·运维·服务器·c++·人工智能·算法
Once_day1 小时前
C++之《程序员自我修养》读书总结(1)
c语言·开发语言·c++·程序员自我修养
Trouvaille ~1 小时前
【Linux】TCP Socket编程实战(一):API详解与单连接Echo Server
linux·运维·服务器·网络·c++·tcp/ip·socket
坚果派·白晓明2 小时前
在鸿蒙设备上快速验证由lycium工具快速交叉编译的C/C++三方库
c语言·c++·harmonyos·鸿蒙·编程语言·openharmony·三方库
小镇敲码人2 小时前
深入剖析华为CANN框架下的Ops-CV仓库:从入门到实战指南
c++·python·华为·cann
张张努力变强3 小时前
C++ STL string 类:常用接口 + auto + 范围 for全攻略,字符串操作效率拉满
开发语言·数据结构·c++·算法·stl
小镇敲码人3 小时前
探索CANN框架中TBE仓库:张量加速引擎的优化之道
c++·华为·acl·cann·ops-nn