news 2025/12/19 14:33:34

C++从入门到实战(二十三)queue的介绍和使用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++从入门到实战(二十三)queue的介绍和使用

C++从入门到实战(二十三)queue的介绍和使用

  • 前言
  • 一、什么是queue
    • 1.1 queue的定义
    • 1.2 queue的核心特性
  • 二、queue的核心接口详解
    • 2.1 构造函数:queue()
    • 2.2 判空操作:empty()
    • 2.3 大小获取:size()
    • 2.4 队头访问:front()
    • 2.5 队尾访问:back()
    • 2.6 入队操作:push()
    • 2.7 出队操作:pop()
  • 三、queue的综合使用示例
  • 四、queue与stack的对比

前言

  • 在上一篇博客中,我们学习了stack——遵循后进先出(LIFO)规则的容器适配器,仅支持栈顶的插入、删除与访问操作;
  • 本篇将聚焦另一种容器适配器——queue(队列):它和stack同属适配器容器,但核心规则是先进先出(FIFO),仅支持从队尾插入元素、从队头删除/访问元素,同样是基于底层序列容器封装的轻量级工具;
  • 我们将从queue的核心特性入手,详解它的定义、底层要求、常用接口的使用方法,并结合示例说明其典型应用场景,帮你掌握队列的核心使用技巧。

我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的C++知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_12880513.html?spm=1001.2014.3001.5482


C++官方queue文档
https://cplusplus.com/reference/queue/queue/

一、什么是queue

1.1 queue的定义

  1. 队列是一种容器适配器,专门用于在FIFO(先进先出,First In First Out)的场景下操作:只能从容器的一端插入元素,从另一端提取元素。
  2. 队列作为容器适配器实现,容器适配器的本质是封装一个特定的容器作为底层容器,queue只会对外提供符合队列规则的成员函数来访问元素:元素从队尾完成入队操作,从队头完成出队操作,无法访问队列中间的元素。
  3. 能够作为queue底层容器的类,需要至少支持以下操作:
    • empty:检测容器是否为空
    • size:返回容器中有效元素的个数
    • front:返回容器首元素的引用
    • back:返回容器尾元素的引用
    • push_back:在容器尾部插入元素
    • pop_front:在容器头部删除元素
  4. STL中的标准容器dequelist都满足这些要求。默认情况下,如果实例化queue时没有指定底层容器,会自动使用标准容器deque

1.2 queue的核心特性

  • 单向操作限制:仅能操作队头和队尾,无法访问/修改队列中间的元素,也不支持迭代器遍历;
  • 适配器特性:仅做接口封装,无额外内存开销,性能完全依赖底层容器;
  • FIFO严格规则:先入队的元素一定会先出队,和现实中的“排队”逻辑完全一致。

二、queue的核心接口详解

queue的接口和stack一样非常精简,仅包含构造、判空、大小、队头/队尾访问、入队、出队这几个核心接口:

2.1 构造函数:queue()

语法

queue<T>q;// T为存储的元素类型,默认底层容器为deque// 或指定底层容器:queue<T, Container> q;

作用

  • 创建一个空的队列,底层容器会执行默认初始化。

示例

#include<queue>#include<iostream>#include<list>usingnamespacestd;intmain(){// 1. 默认构造(底层容器为deque)queue<int>q1;// 2. 指定底层容器为listqueue<int,list<int>>q2;cout<<"q1是否为空:"<<q1.empty()<<endl;// 输出:1(true)return0;}

2.2 判空操作:empty()

语法

boolempty()const;

作用

  • 检测队列是否为空,为空返回true,否则返回false,时间复杂度O(1)。

示例

queue<int>q;cout<<q.empty()<<endl;// 空队列,输出:1(true)q.push(10);cout<<q.empty()<<endl;// 非空队列,输出:0(false)

2.3 大小获取:size()

语法

size_tsize()const;

作用

  • 返回队列中有效元素的个数,返回值为无符号整数size_t

示例

queue<int>q;q.push(1);q.push(2);q.push(3);cout<<"队列的大小:"<<q.size()<<endl;// 输出:3

2.4 队头访问:front()

语法

// 普通版本:返回队头元素的引用(可修改)T&front();// const版本:返回队头元素的const引用(只读)constT&front()const;

作用

  • 返回队列中第一个入队元素的引用,空队列调用front()会导致未定义行为

示例

queue<int>q;q.push(10);q.push(20);// 普通版本:修改队头元素q.front()=100;cout<<"队头元素:"<<q.front()<<endl;// 输出:100// const版本:仅能读取constqueue<int>cq(q);cout<<"const队列的队头元素:"<<cq.front()<<endl;// 输出:100// cq.front() = 200; // 错误:const引用无法修改元素

2.5 队尾访问:back()

语法

// 普通版本:返回队尾元素的引用(可修改)T&back();// const版本:返回队尾元素的const引用(只读)constT&back()const;

作用
返回队列中最后一个入队元素的引用,空队列调用back()会导致未定义行为
示例

queue<int>q;q.push(10);q.push(20);// 普通版本:修改队尾元素q.back()=200;cout<<"队尾元素:"<<q.back()<<endl;// 输出:200

2.6 入队操作:push()

语法

// 拷贝入队:将val拷贝到队尾voidpush(constT&val);// 原地构造(C++11):直接在队尾构造元素,避免拷贝template<class...Args>voidemplace(Args&&...args);

作用

  • 将元素添加到队尾,底层调用底层容器的push_back()接口。
    示例
queue<int>q;// 拷贝入队q.push(1);q.push(2);// 原地构造入队,效果等同于push(3),但效率更高q.emplace(3);cout<<"队尾元素:"<<q.back()<<endl;// 输出:3

2.7 出队操作:pop()

语法

voidpop();

作用
删除队头的元素(仅执行删除操作,不会返回元素),底层调用底层容器的pop_front()接口;空队列调用pop()会导致未定义行为

示例

queue<int>q;q.push(1);q.push(2);q.push(3);cout<<"出队前队头:"<<q.front()<<endl;// 输出:1q.pop();// 删除队头元素1cout<<"出队后队头:"<<q.front()<<endl;// 输出:2cout<<"出队后队列大小:"<<q.size()<<endl;// 输出:2

三、queue的综合使用示例

queue没有迭代器,无法直接遍历,如果需要遍历队列,需要借助临时队列暂存元素,遍历完成后可以选择恢复原队列:

#include<queue>#include<iostream>usingnamespacestd;intmain(){// 1. 初始化队列并入队元素queue<int>q;q.push(10);q.push(20);q.push(30);q.push(40);// 2. 队列的基本属性cout<<"队列是否为空:"<<q.empty()<<endl;// 输出:0cout<<"队列的大小:"<<q.size()<<endl;// 输出:4cout<<"队头元素:"<<q.front()<<endl;// 输出:10cout<<"队尾元素:"<<q.back()<<endl;// 输出:40// 3. 模拟遍历队列(借助临时队列)queue<int>temp;cout<<"队列的元素(队头到队尾):";while(!q.empty()){intval=q.front();cout<<val<<" ";// 输出:10 20 30 40temp.push(val);q.pop();}cout<<endl;// 4. 恢复原队列while(!temp.empty()){q.push(temp.front());temp.pop();}cout<<"恢复后队列大小:"<<q.size()<<endl;// 输出:4return0;}

四、queue与stack的对比

对比维度queue(队列)stack(栈)
核心规则先进先出(FIFO)后进先出(LIFO)
操作位置队尾入队、队头出队栈顶入栈、栈顶出栈
访问接口front()(队头)、back()(队尾)top()(栈顶)
底层默认容器dequedeque
遍历方式需借助临时队列需借助临时栈
典型应用BFS、任务排队括号匹配、逆序处理

我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的C++知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_12880513.html?spm=1001.2014.3001.5482

非常感谢您的阅读,喜欢的话记得三连哦

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/17 23:47:15

大模型Memory模块深度解析:从基础实现到高级应用!

简介 文章详细介绍了大模型Memory模块的设计意义与实现方法&#xff0c;包括不借助LangChain的基础记忆实现、自定义Memory模块开发流程、spacy实体识别的高级应用&#xff0c;以及LangChain中七种内置Memory模块的对比分析。文章还提供了从初阶应用到模型训练的完整学习路径&…

作者头像 李华
网站建设 2025/12/19 8:55:18

53.自定义工作队列传参

这里用到了container_of&#xff0c;可以利用某个成员的地址&#xff0c;顺藤摸瓜拿到拿到整个结构体的地址驱动#include <linux/module.h> #include <linux/init.h> #include <linux/interrupt.h> #include <linux/gpio.h> #include <linux/delay.…

作者头像 李华
网站建设 2025/12/19 8:55:15

安全VR:靠谱的VR安全体验馆厂商品牌榜,技术实力与落地案例

安全VR&#xff1a;靠谱的VR安全体验馆厂商品牌榜&#xff0c;技术实力与落地案例开篇总起在安全培训领域&#xff0c;数字化转型需求迫切&#xff0c;传统培训方式效果欠佳。安全VR体验馆凭借高度还原场景、沉浸式体验等优势&#xff0c;成为提升安全培训效果的有效手段。但市…

作者头像 李华
网站建设 2025/12/19 8:55:13

灵遁者:我对于探索的热爱,从来没有减少过

我对于探索的热爱&#xff0c;从来没有减少过。探索生命&#xff0c;这是自人类诞生以来&#xff0c;一直在拼命解读的课题。所以关于生命&#xff0c;我们思考得再多&#xff0c;也远远不够。 灵遁者&#xff0c;赞3这是一个需要创新的时代&#xff0c;但更是一个需要“消化”…

作者头像 李华
网站建设 2025/12/19 8:55:11

右值引用和移动语义

作用&#xff1a;C11中引用了右值引用和移动语义&#xff0c;可以避免无谓的复制&#xff0c;提高了程序性能。 1. 什么是左值、右值 可以从2个角度判断&#xff1a; 左值可以取地址、位于等号左边&#xff1b; 而右值没法取地址&#xff0c;位于等号右边。 int a 6; a可…

作者头像 李华
网站建设 2025/12/19 8:55:09

基于PLC的智能路灯控制系统的设计

第二章 传感器原理及应用 基于路灯照明的特点&#xff0c;我们需要通过采集周围光照强度及地面压力信号&#xff0c;来完成所需的智能路灯控制的功能&#xff0c;因此本章分别对光学传感器及压力传感器进行了详细的介绍。 2.1 光学传感器 2.1.1 光电效应简介 首先&#xff0c;我…

作者头像 李华