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

C++ -- 队列std::queue

C++ 中的队列(Queue)是一种遵循‌先进先出‌(FIFO, First In First Out)原则的线性数据结构。元素从队尾(Rear)进入,从队头(Front)移除。

在 C++ 中,使用队列主要有两种方式:

  1. 使用 STL 标准库‌:std::queue(最常用、推荐)。
  2. 手动实现‌:基于数组(循环队列)或链表,用于理解底层原理或特定场景优化。

1. STLstd::queue的使用

std::queue是一个‌容器适配器‌,默认底层使用std::deque(双端队列)实现,也可以指定为std::list。它封装了底层容器的操作,只暴露队列特有的接口。

1.1 基本操作

注意‌:pop()函数不返回被删除的元素。如果需要获取并删除队头元素,需先调用front()获取值,再调用pop()

1.2 代码示例
#include <iostream> #include <queue> #include <string> using namespace std; int main() { // 1. 创建队列 queue<int> q; // 2. 入队 (Push) q.push(10); q.push(20); q.push(30); // 3. 查看状态 cout << "队列大小: " << q.size() << endl; // 输出: 3 cout << "队头元素: " << q.front() << endl; // 输出: 10 cout << "队尾元素: " << q.back() << endl; // 输出: 30 // 4. 出队 (Pop) - 注意 pop 没有返回值 if (!q.empty()) { int val = q.front(); // 先获取值 q.pop(); // 再移除 cout << "出队元素: " << val << endl; // 输出: 10 } // 5. 遍历队列 (队列不支持迭代器,只能通过不断出队来遍历,这会破坏队列) // 如果需要保留原队列,通常复制一份或使用其他容器 while (!q.empty()) { cout << q.front() << " "; q.pop(); } // 输出: 20 30 return 0; }
1.3 自定义底层容器

虽然默认使用deque,但你可以根据需求指定底层容器:

#include <list> #include <queue> // 使用 list 作为底层容器(适合频繁插入删除,但内存开销大) queue<int, list<int>> q_list; // 使用 deque 作为底层容器(默认,缓存友好,支持随机访问但队列接口屏蔽了该功能) queue<int, deque<int>> q_deque;
#include <iostream> #include <stdexcept> using namespace std; template <typename T> class CircularQueue { private: T* data; int front; int rear; int capacity; public: CircularQueue(int size) : capacity(size + 1), front(0), rear(0) { data = new T[capacity]; } ~CircularQueue() { delete[] data; } bool isEmpty() { return front == rear; } bool isFull() { return (rear + 1) % capacity == front; } void push(T val) { if (isFull()) { throw overflow_error("Queue is full"); } data[rear] = val; rear = (rear + 1) % capacity; } void pop() { if (isEmpty()) { throw underflow_error("Queue is empty"); } front = (front + 1) % capacity; } T getFront() { if (isEmpty()) { throw underflow_error("Queue is empty"); } return data[front]; } int size() { return (rear - front + capacity) % capacity; } }; // 测试 int main() { CircularQueue<int> cq(3); // 实际只能存3个元素,因为预留了一个空间 cq.push(1); cq.push(2); cq.push(3); cout << "Front: " << cq.getFront() << endl; // 1 cq.pop(); cout << "Front after pop: " << cq.getFront() << endl; // 2 cq.push(4); // 此时空间复用 cout << "Size: " << cq.size() << endl; // 3 return 0; }
http://www.rkmt.cn/news/1423062.html

相关文章:

  • Meshroom:零基础开启专业3D重建的完整指南
  • LeetCode 补拙笔记 日期:2026.05.29 题目:1559. 二维网格图中探测环
  • 5分钟快速上手洛雪音乐助手:免费跨平台音乐聚合播放器终极指南
  • 海思Hi3518E VPSS配置避坑指南:从GROUP到CHANNEL,手把手搞定视频处理子系统
  • 基于树莓派与CNN的工业缺陷检测系统:从硬件搭建到模型部署全流程
  • 四步终极指南:用OpenCore Legacy Patcher让老Mac免费升级最新系统
  • 别让变量名拖后腿!C语言标识符命名规则详解(附ZZULIOJ 1138题实战解析)
  • ESP32驱动CRT电视板与SHARP TFT屏:模拟视频系统改造全解析
  • 一键永久激活Windows和Office:KMS智能激活完整解决方案
  • 基于ESP32的DIY四轴飞行器:从硬件设计到PID控制全解析
  • 面试官的提问与燕双非的回答:Java 技术栈在电商场景中的应用
  • Aspose.Words for Java 实战:Word转PDF页码对不上?手把手教你排查和修复
  • 2026年5月最新|杭州全屋定制哪家好?本地源头工厂盘点,高性价比品牌选购指南 - 商业新知
  • Lindy财务自动化黄金窗口期仅剩47天:财政部新规倒逼Q3前完成自动化凭证链审计留痕
  • Agent Skills 万千应用 · 第14篇_论文追踪 Skill:自动关注新论文,把资料变成判断
  • 别再乱并电容了!从MCU电源脚到DC-DC,手把手教你选对104和10uF(附实战案例)
  • 2026 海南注册公司营业执照代办排名:资质、速度、口碑全方位测评 - 企业推荐官【官方】
  • 从知网到Word:文献管理小白用NoteExpress三步完成参考文献自动排版(以XX大学版为例)
  • 从散乱收藏到秒级检索:技术写作素材管理实践
  • 构建AI数据湖:从架构原则到工程实践,避免数据沼泽
  • 终极指南:如何用RPFM编辑器快速打造你的Total War模组世界
  • D2DX终极指南:三步让《暗黑破坏神2》在现代电脑上焕然一新
  • 终极指南:如何在个人电脑上免费部署本地大语言模型GPT4All
  • 智能手表IMU数据挖掘:从步态分析到健康监测的端侧AI实践
  • Pythonweakref与弱引用
  • Lindy智能灌溉控制器深度拆解(固件漏洞/通信协议/边缘逻辑全曝光)
  • 别再傻傻分不清!工业自动化里零线和地线接错有多危险?附安全接线实操
  • ​ 带标注的番茄西红柿疾病检测数据集,可识别健康和8种常见疾病的叶子,识别率99.1%,8226张图,支持yolo,coco json,voc xml,文末有模型训练代码
  • Pythonuuid与唯一标识
  • 当微信聊天记录成为数字遗产:一个开源项目的警示与思考