当前位置: 首页 > news >正文

【C++ STL】 容器详解:queue 学习

在 C++ STL(标准模板库)中,queue 是一个 FIFO(先进先出) 的顺序容器,适用于 排队处理 场景,如任务调度、数据缓冲等。它基于 双端队列(deque) 实现,提供了高效的插入和删除操作。

1. queue 的基本特点

  • 先进先出(FIFO):新元素入队(push),旧元素先出队(pop)。

  • 底层实现:通常基于 双端队列(deque)

  • 受限的访问queue只允许在队尾插入元素,在队头移除元素,不支持随机访问。

  • 时间复杂度:入队(push)和出队(pop)操作的时间复杂度均为 O(1)

2. queue 的基本用法

2.1 queue 的定义与初始化

以下是一些常见的定义方式:

queue<int> q1; // 定义一个空的queue,存储int类型的元素
queue<int> q2(q1); // 使用另一个queue初始化
#include <iostream>
#include <queue>
using namespace std;

int main() {
    queue<int> q;
    
    // 入队
    q.push(10);
    q.push(20);
    q.push(30);
    
    // 访问队头元素
    cout << "队头: " << q.front() << endl;
    
    return 0;
}

输出:

队头: 10

2.2 入队与出队(插入和删除)

可以使用push方法queue插入元素。新元素会被添加到队尾

可以使用pop方法queue移除队头元素。注意,pop方法不会返回被移除的元素

queue<int> q;
q.push(10); //入队10
q.push(20); //入队20
q.push(30); //入队30
q.pop(); // 移除队头元素10

2.3 访问队头和队尾元素

可以使用front方法访问队头元素,使用back方法访问队尾元素。

cout << "队头: " << q.front() << endl;
cout << "队尾: " << q.back() << endl;

queue<int> q;
q.push(10);
q.push(20);
q.push(30);
cout << "Front element: " << q.front() << endl; // 输出: 10
cout << "Back element: " << q.back() << endl; // 输出: 30

2.4 检查队列是否为空

if (q.empty()) {
    cout << "队列为空" << endl;
}

2.5 获取队列大小

cout << "队列大小: " << q.size() << endl;

3. queue 的应用场景

  • 任务调度:操作系统中的 任务队列,按顺序处理任务。queue遵循先进先出的原则,最先插入的元素最先被移除。这使得queue非常适合用于任务调度、消息队列等场景。

    queue<int> q;
    q.push(10);
    q.push(20);
    q.push(30);
    while (!q.empty()) {
        cout << q.front() << " ";
        q.pop();
    }
    // 输出: 10 20 30
  • 受限的访问:queue只允许在队尾插入元素,在队头移除元素,不支持随机访问。如果需要随机访问,可以考虑使用dequevector

  • queue是一个容器适配器,它基于其他容器(如dequelist)实现。默认情况下,queue基于deque实现,但也可以指定其他容器。

    queue<int, list<int>> q; // 基于list实现的queue
  • 数据缓冲:消息队列、IO 任务处理。

  • 广度优先搜索(BFS):遍历树或图的常用工具。

4. queuepriority_queuedeque 的区别

特性queuepriority_queuedeque
底层结构双端队列(deque)堆(heap)双端队列(deque)
元素顺序先进先出(FIFO)按优先级出队两端均可操作
插入/删除复杂度O(1)O(log n)O(1)
适用场景普通队列任务调度、优先级处理需要两端操作的场景

总结

queue 是 C++ STL 中的 先进先出 顺序容器,适用于 任务管理、数据缓冲和 BFS 等场景。如果需要按照优先级出队,可以使用 priority_queue,如果需要两端操作,可以使用 deque

http://www.dtcms.com/a/67339.html

相关文章:

  • 从头开始开发基于虹软SDK的人脸识别考勤系统(python+RTSP开源)(五)完整源码已上传!
  • 基于MySQL有用户管理的音乐播放器
  • Java 虚拟机优化指南:CMS垃圾回收器参数调优与性能监控工具详解
  • obeaver 连接oracle 库 模式乱码
  • XXE-labs靶场通关攻略
  • 【菜鸟飞】通过vsCode用python访问公网deepseek-r1等模型(Tocken模式)
  • cs224w课程学习笔记-第7课
  • Harmony OS:用户文件操作——图片选择与渲染使用
  • Docker根目录迁移与滚动日志设置
  • leetcode日记(96)有序链表转换二叉搜索树
  • 记录致远OA服务器硬盘升级过程
  • Android第二次面试总结(项目拷打理论篇)
  • Gone v2 中 Gone-Gin 性能测试报告
  • kotlin与MVVM的结合使用总结(二)
  • hackme靶机通关攻略
  • Java数组详解(一)
  • IDE 使用技巧与插件推荐:全面提升开发效率
  • vue3+ts+vite环境中使用json-editor-vue3,记录遇到的奇奇怪怪问题!!!
  • 三格电子Modbus TCP转CANOpen网关相关问答
  • 【vscode-01】vscode不同项目不同语言扩展插件隔离方案
  • 智算新纪元,腾讯云HAI-CPU助力法律援助
  • 提升工地安全:视觉分析助力挖掘机作业监控
  • 夜莺监控 v8.0 新版通知规则 | 对接企微告警
  • 前端面试:如何实现预览 PDF 文件?
  • PostgreSQL 日常SQL语句查询记录--空间查询
  • 单体架构、微服务组件与解决方案
  • 开VR大空间体验馆,如何最低成本获取最大收入?
  • RabbitMQ 实现原理及流程
  • 多线程--参数传递之间的关系
  • react和vue 基础使用对比