首页/新闻资讯/正文详情

C++ 标准模板库(STL)中的容器适配器(container adapter),它提供先进先出(FIFO,First-In-First-Out) 的数据结构

发布时间:2026/9/25 13:28:28 来源:云帆数科 栏目:资讯中心
C++ 标准模板库(STL)中的容器适配器(container adapter),它提供先进先出(FIFO,First-In-First-Out) 的数据结构
Cstd::queue详解std::queue是 C 标准模板库STL中的容器适配器container adapter它提供先进先出FIFOFirst-In-First-Out的数据结构。队列常用于广度优先搜索BFS、任务调度、消息队列等场景。1. 基本概念FIFO最先进入队列的元素最先被取出。std::queue不是一个独立的容器而是基于其他容器实现的适配器。默认底层容器std::deque双端队列因为它在头部删除和尾部插入都非常高效O(1)。你也可以指定其他底层容器如std::list或std::vector但需满足特定要求支持front()、back()、push_back()、pop_front()等。2. 头文件与命名空间#includequeue// 必须包含#includedeque// 默认底层容器#includelist// 可选#includevector// 可选不推荐作为 queue 的底层usingnamespacestd;3. 声明方式// 最常用queueintq;// 存储 int 的队列默认 dequequeuestring,dequestringq1;// 显式指定底层容器queueint,listintq2;// 使用 list 作为底层容器queuedouble,vectordoubleq3;// vector 也可以但 pop_front 效率低模板参数queueT, Container dequeT4. 常用成员函数时间复杂度均为 O(1)函数功能返回值注意事项push(val)从队尾插入元素void-emplace(...)原地构造元素C11void比 push 更高效pop()删除队头元素void不返回元素front()返回队头元素的引用T / const T队列为空时未定义行为back()返回队尾元素的引用T / const T队列为空时未定义行为empty()判断队列是否为空bool-size()返回队列中元素个数size_t-swap(q2)与另一个 queue 交换内容voidC11注意pop()不会返回被删除的元素如果你需要取出元素必须先front()再pop()。访问front()/back()前必须确保!empty()否则是未定义行为可能崩溃。5. 完整代码示例示例 1基础使用#includeiostream#includequeue#includestringusingnamespacestd;intmain(){queuestringq;// 入队q.push(任务1);q.push(任务2);q.emplace(任务3);// C11更推荐cout队列大小: q.size()endl;// 3cout队头元素: q.front()endl;// 任务1cout队尾元素: q.back()endl;// 任务3// 出队while(!q.empty()){cout处理: q.front()endl;q.pop();}cout队列是否为空: (q.empty()?是:否)endl;return0;}示例 2BFS广度优先搜索经典应用#includeiostream#includequeue#includevectorusingnamespacestd;vectorvectorintgraph{{1,2},// 0 的邻居{0,3},// 1 的邻居{0,3},// 2 的邻居{1,2,4},// 3 的邻居{3}// 4 的邻居};voidbfs(intstart){vectorboolvisited(graph.size(),false);queueintq;q.push(start);visited[start]true;while(!q.empty()){intuq.front();q.pop();coutu ;for(intv:graph[u]){if(!visited[v]){visited[v]true;q.push(v);}}}}intmain(){coutBFS 遍历顺序: ;bfs(0);coutendl;return0;}示例 3自定义底层容器 自定义类型#includeiostream#includequeue#includelistusingnamespacestd;structTask{intpriority;string name;};intmain(){// 使用 list 作为底层容器queueTask,listTasktasks;tasks.push({1,低优先任务});tasks.push({3,高优先任务});while(!tasks.empty()){Task ttasks.front();cout执行任务: t.name (优先级 t.priority)\n;tasks.pop();}}6.std::priority_queue优先队列如果你需要按优先级出队而不是严格 FIFO请使用priority_queue默认是大根堆#includequeuepriority_queueintpq;// 大根堆priority_queueint,vectorint,greaterintpq_min;// 小根堆// 自定义比较structCompare{booloperator()(constTaska,constTaskb){returna.priorityb.priority;// 优先级高的先出}};priority_queueTask,vectorTask,Comparetask_pq;7. 注意事项与最佳实践线程安全STL 的queue不是线程安全的多线程环境下需要自己加锁。性能默认deque是最佳选择vector作为底层时pop会低效。异常安全push/emplace可能抛出异常pop、front等通常不抛出。C11 改进emplace、swap、移动语义支持更好。清空队列没有clear()可以用while(!empty()) pop();或交换一个空队列。queueintempty_q;q.swap(empty_q);// 快速清空8. 总结普通队列用std::queueFIFO带优先级用std::priority_queue环形缓冲考虑std::deque或 boost::circular_buffer并发队列生产环境推荐使用线程安全的实现如tbb::concurrent_queue或自己封装需要更深入的内容如队列的底层实现原理、与deque的源码对比、或在 LeetCode 中的应用随时告诉我

相关推荐

C++ 模板参数 详解 + 实例代码
C++ 模板参数 详解 + 实例代码

C++ 模板参数 详解 + 实例代码 C++ 模板(Template) 是实现泛型编程的核心机制,允许代码在编译期根据参数类型生成具体代码,从而实现类型安全和高性能。 1. 模板参数的种类 模板参数主要有三类: 类型参数(Type Parameter)—— 最常用 非类型参数(Non-type Parameter)… · 2026/9/25 13:28:28

AI skills 配置 TaoToken:settings.json 骨架与验证动作
AI skills 配置 TaoToken:settings.json 骨架与验证动作

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 13:28:22

Android开发-教你玩转Android数据存储SQLite 如何加载SD卡数据库
Android开发-教你玩转Android数据存储SQLite 如何加载SD卡数据库

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 13:28:04

C++模板编译期计算:从递归实例化到constexpr的现代实践
C++模板编译期计算:从递归实例化到constexpr的现代实践

模板编译期计算这个话题,搁在C社区里基本就是模板元编程的代名词。我最早接触它是在读Loki库和Boost.MPL源码的时候,第一感觉是这玩意儿不像代码,更像在给编译器出谜题——你写一套规则,编译器在编译阶段替你跑完所有“计算”&… · 2026/9/25 13:56:23

Python小屋编程题91-100复盘:语法进阶与高频陷阱解析
Python小屋编程题91-100复盘:语法进阶与高频陷阱解析

刷题刷到第90多道是什么感觉?微信上有个读者跟我抱怨,Python小屋的题他每道都能写出来,可一看参考解答,总觉得自己的代码又臭又长,像在拼积木,人家写的却像在盖房子。这问题太典型了。Python小屋剧本里的编… · 2026/9/25 13:56:23

Server 2019 安装 Intel 无线网卡驱动失败?WLAN 服务与 INF 修改排障全攻略
Server 2019 安装 Intel 无线网卡驱动失败?WLAN 服务与 INF 修改排障全攻略

这活儿其实挺有意思的。一台要当工作站的 Windows Server 2019,塞了一块 Intel Wireless-N 7265 无线网卡,结果系统死活不认。设备管理器里永远是一坨黄色感叹号,Intel 官方驱动包双击就弹"此系统不支持",我一度以为是卡… · 2026/9/25 13:56:17

C# API限流计数一次扣2?从请求重复与中间件顺序定位修复
C# API限流计数一次扣2?从请求重复与中间件顺序定位修复

C# API项目里出现X-Rate-Limit-Remaining一次请求直接减2,这个问题我最近一个月里被问到了好几次。AspNetCoreRateLimit、.NET内置的RateLimiter,甚至自己写的简单计数中间件,都可能出现同一个表象:前端明明只点击了一次&#xff… · 2026/9/25 13:56:17

Docker封装GPU推理环境:从CUDA冲突到容器化部署实战
Docker封装GPU推理环境:从CUDA冲突到容器化部署实战

说实话,我一开始对“把 GPU 推理环境塞进 Docker”这件事是抗拒的。当时我维护一台多人共用的 GPU 服务器,PyTorch、CUDA、cuDNN、TensorRT 的版本全靠人工协调,某天同事在~/.bashrc里改了一行 CUDA 路径,整个小组的推理服务全部起… · 2026/9/25 13:56:11

别阻塞主线程:zip4cj子线程压缩与进度监控的实战教程
别阻塞主线程:zip4cj子线程压缩与进度监控的实战教程

别阻塞主线程:zip4cj子线程压缩与进度监控的实战教程 【免费下载链接】zip4cj 一个用于创建和解压ZIP压缩格式的库 项目地址: https://gitcode.com/Cangjie-TPC/zip4cj zip4cj 是基于仓颉语言实现的 ZIP 压缩解压缩库。它的 子线程压缩 让耗时打包在后台执行… · 2026/9/25 13:56:11

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码