讲师中心 微信公众号
AI工具推荐 视频效率加速

C++ queue适配器 先进先出队列实现

大杰酱_5244

大杰酱_5244

发布时间:2025-08-21 12:16:02

|

500人浏览过

|

来源于php中文网

原创

std::queue是基于deque等容器的FIFO适配器,提供push、pop、front、back等操作,用于任务调度、BFS等场景,需手动实现线程安全。

c++ queue适配器 先进先出队列实现

C++的

std::queue
是一个容器适配器,它提供了一种先进先出(FIFO)的数据结构,这意味着你放入的第一个元素,也将会是第一个被取出的。它本身不是一个独立的容器,而是通过封装其他序列容器(比如
std::deque
或
std::list
)来提供这种特定行为模式的接口。

要使用

std::queue
,你需要包含
<queue>
头文件。它的基本操作直观且符合FIFO原则:
push()
用于在队尾添加元素,
pop()
用于移除队头元素,
front()
用于访问队头元素,而
back()
则用于访问队尾元素。此外,
empty()
可以检查队列是否为空,
size()
则返回队列中元素的数量。

#include <iostream>
#include <queue>
#include <string>

int main() {
    std::queue<std::string> messageQueue;

    // 模拟消息入队
    messageQueue.push("订单处理请求");
    messageQueue.push("用户登录事件");
    messageQueue.push("库存更新通知");

    std::cout << "队列当前大小: " << messageQueue.size() << std::endl;
    std::cout << "队头元素: " << messageQueue.front() << std::endl;
    std::cout << "队尾元素: " << messageQueue.back() << std::endl;

    // 模拟消息出队处理
    while (!messageQueue.empty()) {
        std::string currentMessage = messageQueue.front();
        messageQueue.pop();
        std::cout << "处理消息: " << currentMessage << std::endl;
    }

    std::cout << "队列是否为空? " << (messageQueue.empty() ? "是" : "否") << std::endl;

    return 0;
}

这个例子展示了

std::queue
如何模拟一个消息队列,新消息总是在队尾排队,而处理总是从队头开始。它默认使用
std::deque
作为其底层容器,因为
deque
在两端都有高效的插入和删除能力,这正是
queue
操作所需要的。

C++
std::queue
适配器的工作原理与底层容器选择

std::queue
的“适配器”本质,在我看来,是它设计上一个非常巧妙的地方。它不是自己管理内存或元素,而是像一个“壳”或者“包装器”,给底层的序列容器(比如
std::deque
或
std::list
)套上了一层特定的行为规范。说白了,它限制了你对底层容器的直接访问,只暴露了
push
(尾部插入)、
pop
(头部删除)、
front
(头部访问)和
back
(尾部访问)这些符合FIFO原则的操作。

立即学习“C++免费学习笔记(深入)”;

默认情况下,

std::queue
使用
std::deque
作为其底层容器。为什么是
deque
呢?
deque
(双端队列)的特点是它可以在两端(头部和尾部)都进行O(1)复杂度的插入和删除操作。这对于
queue
来说简直是完美匹配:
push
操作就是在
deque
的尾部添加,
pop
操作就是在
deque
的头部删除。如果换成
std::vector
,虽然尾部插入高效,但头部删除就需要移动所有后续元素,效率会很低。而
std::list
(双向链表)虽然在任意位置插入删除都是O(1),但在内存布局上不如
deque
连续,这在某些场景下可能会有不同的缓存表现。所以,
std::deque
在性能和功能上为
std::queue
提供了非常平衡的默认选择。你当然可以显式指定
std::list
作为底层容器,比如
std::queue<int, std::list<int>> myQueue;
,这通常在需要严格的O(1)插入/删除且不关心内存连续性时会考虑,或者在某些特定场景下,比如当元素数量非常庞大且频繁在两端操作,
list
能避免
deque
可能发生的内存重新分配。

在实际开发中,何时选择使用
std::queue
而非其他容器?

选择

std::queue
,通常是当你明确需要一个“排队”的逻辑时。它强制了先进先出的访问模式,这本身就是一种设计约束,避免了你意外地从队列中间或末尾取出元素,从而保证了业务逻辑的正确性。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

在我日常的开发经验中,

std::queue
的典型应用场景包括:

  • 任务调度与消息队列:这是最常见的应用。比如,一个服务器接收到很多待处理的请求(如日志写入、数据同步、异步计算),可以把这些请求封装成任务,然后放入一个
    std::queue
    中。后台的工作线程则不断从队列头部取出任务并执行。这确保了任务按照接收的顺序被处理。
  • 广度优先搜索(BFS):在图算法中,BFS需要从一个节点开始,先访问所有邻居节点,再访问邻居的邻居,以此类推。
    std::queue
    在这里扮演了关键角色,它存储了待访问的节点,并保证了“先发现的先访问”的顺序。
  • 事件处理系统:当系统中有多个事件源产生事件,并且这些事件需要按时间顺序或生成顺序被处理时,
    std::queue
    可以用来缓冲这些事件。
  • 打印队列或下载队列:想象一下,你发送了多个打印任务,或者下载多个文件,这些任务通常会按照提交的顺序排队等待处理。

相比于

std::vector
或
std::list
,
std::queue
的优势在于其语义的明确性。
std::vector
虽然可以模拟队列,但你需要手动管理头部元素的删除(这通常效率不高),而且它允许你进行随机访问,这可能会引入不符合FIFO逻辑的错误。
std::list
虽然在两端操作高效,但其语义是通用的链表,同样需要你手动维护FIFO的逻辑。
std::queue
通过其适配器特性,直接提供了这种“排队”的抽象,让代码意图更加清晰,也降低了误用的风险。

C++
std::queue
在并发编程中的应用与线程安全问题

当谈到

std::queue
在多线程环境下的应用时,一个核心且必须注意的问题就是线程安全性。标准库中的
std::queue
,就像大多数其他容器一样,本身并不是线程安全的。这意味着,如果在多个线程中同时对同一个
std::queue
实例进行
push
、
pop
、
front
、
back
等操作,就可能发生数据竞争(data race),导致未定义行为。这包括数据损坏、程序崩溃,或者更隐蔽的逻辑错误。

想象一下,两个线程同时尝试从一个只有一个元素的队列中

pop
,或者一个线程在
push
,另一个线程在
pop
,这些操作如果不加保护,很可能会导致内部状态(比如底层容器的大小、指针)出现不一致。

要在并发环境中使用

std::queue
,你必须手动实现同步机制来保护它。最常见的方法是使用互斥量(
std::mutex
)来保护对队列的访问,并结合条件变量(
std::condition_variable
)来处理生产者-消费者模式中的等待/通知机制。

一个典型的线程安全队列的实现思路是:

  1. 封装
    std::queue
    :创建一个新的类,内部包含一个
    std::queue
    实例。
  2. 互斥量保护:为这个新类的所有涉及
    std::queue
    操作的成员函数(如
    push
    、
    pop
    、
    empty
    、
    size
    等)加上互斥量(
    std::mutex
    )的锁。例如,在
    push
    之前加锁,操作完成后解锁。
  3. 条件变量:在消费者线程尝试
    pop
    时,如果队列为空,它需要等待生产者线程
    push
    新元素。这时,可以使用
    std::condition_variable
    让消费者线程进入等待状态,直到生产者线程通知有新元素可用。同样,如果队列有容量限制,生产者在队列满时也可能需要等待消费者
    pop
    。

这听起来有点复杂,但实际上是并发编程中非常标准且必要的模式。自己实现一个简单的线程安全队列,是理解这些概念很好的实践。当然,在实际项目中,你可能会倾向于使用一些成熟的并发库(如TBB、Boost.Asio)中提供的线程安全队列,或者C++20引入的协程和更高级的并发原语来简化开发。但无论如何,理解

std::queue
本身的非线程安全性质,以及如何通过同步机制来保护它,是构建健壮多线程应用的基础。

热门AI工具

更多
PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

7259

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3465

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

4548

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

3045

2025.08.29

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

379

2026.04.23

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2821

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

396

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

437

2026.01.06

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
进击Node.js基础(二)
进击Node.js基础(二)

共8课时 | 3.2万人学习

TP5.0 MVC入门视频教程
TP5.0 MVC入门视频教程

共9课时 | 7.8万人学习

DBeaver AI数据隐私指南
DBeaver AI数据隐私指南

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn