当前位置: 首页 > 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.cnnetsun.cn/news/2643027.html

相关文章:

  • 终极指南:如何免费快速解码QQ音乐加密文件(qmcdump完整教程)
  • 四步终极指南:用OpenCore Legacy Patcher让老Mac免费升级最新系统
  • 低资源多模态内容审核实战:CLIP+BGE-M3融合与动态门控机制解析
  • 5步掌握FGA:FGO安卓自动战斗终极指南
  • qBittorrent-Enhanced-Edition定时任务配置指南:让下载更智能、更省电
  • MQ-135空气质量检测实战:用ESP32打造一个低成本室内有害气体监测站
  • 5分钟掌握免费音乐解密工具:解锁你的数字音乐收藏终极指南
  • 终极游戏控制器兼容解决方案:ViGEmBus驱动完整指南
  • 从奶茶配方到游戏平衡:正交设计在互联网产品中的那些‘骚操作’
  • 【 linux 】动静态库的制作
  • 3个关键步骤:用DistroAV插件搭建专业级NDI直播工作流
  • 别再手动填DBC了!用CANdb++ Editor的3个隐藏技巧,效率翻倍
  • Python量化投资实战:用MOOTDX轻松解锁通达信金融数据宝库
  • 【护网入门】什么是护网行动?小白也能看懂的护网概念全解析
  • Unity独立游戏开发者必看:Player面板里这5个隐藏设置,能让你的游戏启动体验提升一个档次
  • 全链路监控与持续迭代:多模态AI系统的运维与优化
  • 告别Electron大体积!用Tauri把任意网站URL变成5MB的桌面软件(附完整配置流程)
  • DDS、SOME/IP、冰羚(iceoryx)大乱斗:智能汽车通信中间件选型深度解析
  • 扩散模型在机器人轨迹规划中的创新应用
  • 告别付费iSaver!用Wallpaper Engine免费搞定Win10动态锁屏(保姆级教程)
  • CMake编译选项进阶:用target_compile_options和生成器表达式实现跨平台条件编译
  • 终极音乐解放指南:3分钟破解网易云音乐NCM格式限制
  • 2026论文降AIGC软件:11款工具实测谁在“智能”谁在“智障”?
  • 如何永久保存微信聊天记录:WeChatMsg终极数据留存指南
  • 终极Windows热键冲突解决方案:hotkey-detective完整使用指南
  • 仅剩3席!Lindy 2024认证自动化工程师内训资料包(含私有化部署checklist+审计日志解析工具)
  • 免费录音转文字怎么操作?2026保姆级教程手把手教你永久免费转写
  • AI建站工具怎么选?一份写给新手的选型标准与对比指南
  • 完整指南:RevokeMsgPatcher深度解析Windows平台消息防撤回技术实现
  • 基于Next.js与OpenAI API构建智能简历生成器:全栈AI应用开发实践