跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ queue 类源码实现与逻辑详解

C++ STL 中的 queue 容器适配器。queue 遵循先进先出(FIFO)原则,底层基于 deque 或 list 实现。文章介绍了 push、pop、front、back、size、empty 等常用函数,并展示了基于模板的完整源码实现,帮助开发者理解其内部逻辑与高效性能。

黑客帝国发布于 2026/3/27更新于 2026/9/964 浏览
C++ queue 类源码实现与逻辑详解

1. queue 介绍及使用方法

queue 是 C++ 标准模板库(STL)中的容器适配器,遵循先进先出(FIFO)原则。它基于其他容器(如 deque 或 list)实现,仅允许在队尾插入元素,在队头删除元素。

queue 的底层通常是一个 deque<T>(双端队列),虽然 deque 是可以从两端来进行操作的,但是我们只要只提供一端的接口,那么就可以来把它当做 queue 来使用。

因为 queue 需要支持高效的'队尾插入'(push)和'队头删除'(pop)操作,而 deque 的 push_back(尾插)和 pop_front(头删)操作均能在常数时间内完成,且无需像 vector 那样在头删时移动大量元素,也无需像 list 那样维护额外的指针开销,综合性能更优。

2. queue 的常用函数

函数名函数作用
void push(const T& x)在尾部插入元素
void pop()移除头部元素
T& front()返回头部元素
T& back()返回尾部元素
size_t size()返回队列的大小
bool empty()判断是否为空,为空就返回 true

3. 模板参数说明

在这里写两个 class 是为了方便使用,这两个模板参数实际上是各司其职,只是语法上要求写在同一个 template<> 里,使用时会根据场景自动匹配对应的参数。

前面的 T 是明确指定队列中元素的类型(比如 int、string 等),这是队列对外提供的'数据类型契约'—— 队列里只能存 T 类型的东西。后面的 Container 是指定用什么容器来存储这些 T 类型的元素,而默认的 deque<T> 就是'用双端队列来存 T 类型元素'的意思。

PS:只写后面那一个理论上来说也是可以的,但是会让用户使用门槛变高,比如想声明一个存 int 的队列,用户不能直接写 queue<int>,而必须写成 queue<deque<int>>(如果想用默认容器),或者 queue<vector<int>>。这会让接口变得不直观——用户需要先知道底层容器的类型,才能正确声明队列,违背了'队列是容器适配器,用户无需关心底层实现'的设计初衷。

PS:只写前面哪一个是不行的,如果只写 template<class T>,就意味着用户无法指定底层容器了——因为没有 Container 这个参数来接收用户自定义的容器类型。

template<class T, class Container = deque<T>>

4. 私有成员变量

这就是申明一个私有成员 _con。

: Container _con;
private

5. pop() 方法

弹出队头,因为队列是先进先出的。

void pop() { _con.pop_front(); }

6. front() 方法

返回队头元素。

PS:这边使用 T& 是为了调用者可以直接修改队列中真正的队头元素,避免不必要的拷贝开销。

T& front() { return _con.front(); }

7. back() 方法

返回队尾元素。

队列是先进先出,但是在很多场景下,除了需要知道'最早入队的元素'(队头,front()),还可能需要获取'最新入队的元素'(队尾)。

back() 只是'读取'队尾元素,不会修改队列的结构或元素顺序,因此不会破坏其核心逻辑。

T& back() { return _con.back(); }

8. size() 方法

通过调用双端队列的 size() 来返回队列 size 的大小。

size_t size() { return _con.size(); }

9. empty() 方法

判断是否为空,为空就返回 true。

bool empty() { return _con.empty(); }

10. push() 方法

在队列尾部插入一个元素。

void push(const T& x) { _con.push_back(x); }

11. 总结

综上,queue 凭借简洁的接口、高效的底层实现,成为处理顺序依赖场景的理想选择。理解其基于 deque 的适配逻辑,能帮助开发者更合理地运用队列解决实际问题。

以下是 queue 的完整代码:

template<class T, class Container = deque<T>>
class queue {
public:
    void push(const T& x) { _con.push_back(x); }
    void pop() { _con.pop_front(); }
    T& front() { return _con.front(); }
    T& back() { return _con.back(); }
    size_t size() { return _con.size(); }
    bool empty() { return _con.empty(); }
private:
    Container _con;
};

目录

  1. 1. queue 介绍及使用方法
  2. 2. queue 的常用函数
  3. 3. 模板参数说明
  4. 4. 私有成员变量
  5. 5. pop() 方法
  6. 6. front() 方法
  7. 7. back() 方法
  8. 8. size() 方法
  9. 9. empty() 方法
  10. 10. push() 方法
  11. 11. 总结

更多推荐文章

查看全部
  • 基于 AI 的智能算力分配:云原生架构与实践
  • 浙人医基于 KingbaseES 实现多院区异构多活容灾架构
  • 使用阿里开源 CoPaw 在魔搭创空间部署个人 AI 助理
  • Python 与 Excel 数据分析效率对比:性能差异实测
  • 灵感画廊 AI 绘画工具安装与使用指南
  • 前端实现 HTML 转 Word 文档的完整方案
  • PyGoogleNews 指南:使用 Python 获取 Google 新闻数据
  • Python 3.12 内置函数全解析:71 个核心工具详解
  • 前端核心面试题详解:闭包、事件循环、Vue 原理等
  • Android 开发向纯血鸿蒙应用开发的迁移与准备指南
  • 一天一个开源项目(第43篇):Star-Office-UI - 像素风格的 AI 办公室看板,让 AI 助手的工作状态可视化
  • 前端国际化最佳实践:从硬编码到专业方案
  • 大模型推理网关设计与实现:2 小时 AI Coding 实战
  • 用 OpenClaw 和飞书搭一个 7x24 服务器运维机器人
  • 金仓数据库 KingbaseES 多模融合架构与全替代实践
  • 终身机器人学习数据集 LIBERO 详解
  • 基于SpringBoot的高铁售票系统设计与实现
  • 教育元宇宙 VR 协作工具交互延迟测试详解
  • AI 视频生成技术迈入实用阶段:解析央视短片背后的技术路径
  • 创新思维与创新管理:唐兴通课程核心内容与 AI 时代应用

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online