std::queue 是仅支持 FIFO 操作的容器适配器,底层默认用 deque 实现,不支持遍历或随机访问;存裸指针易致内存泄漏,应优先用 shared_ptr 或直接存对象,并须判空再 front/pop。

queue 是什么,为什么不能直接用 queue 存对象指针还忘了 delete
std::queue 是 C++ 标准库里的容器适配器,底层默认用 std::deque 实现。它只提供 FIFO(先进先出)接口,不支持随机访问、遍历或查找——这点常被误当成“普通容器”来用。
常见错误现象:queue<MyClass*> 塞了一堆 new MyClass(),但 pop 之后没 delete,导致内存泄漏;或者误以为 front() 返回的是副本,其实返回的是引用(对指针类型来说,只是指针值的拷贝,不是对象本身)。
- 使用场景:任务调度、BFS 层序遍历、解耦生产/消费节奏
- 别在
queue里存裸指针,除非你明确掌控生命周期;优先用std::shared_ptr<T>或直接存对象(如果T可移动且开销可控) - 性能影响:默认底层是
deque,push/pop 复杂度均摊 O(1);若强制指定list为底层容器(如queue<int, list<int>>),插入仍 O(1),但缓存局部性更差
怎么安全地取元素:别只调 front() 就完事
front() 和 back() 都是 const 引用或非 const 引用,不移除元素;真正删元素得靠 pop()。但 pop() 不返回值——这是和 Python 的 queue.Queue.get() 最大区别,也是新手踩坑重灾区。
常见错误现象:写成 auto x = q.front(); q.pop();,看似取+删,但如果 q 为空,front() 行为未定义(不是抛异常,是 UB)。
立即学习“C++免费学习笔记(深入)”;
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 必须先检查
q.empty()再调front()或pop() - 想“取并删”,得两步写全:
if (!q.empty()) { auto x = q.front(); q.pop(); /* use x */ } - 如果需要原子性“取并删”语义,自己封装函数,或改用
std::deque直接操作(它有pop_front()+ 返回值的变体需自行实现)
初始化和常用操作:别把 queue 当 vector 用
std::queue 没有迭代器,不能用范围 for 遍历,也不能用 size() 做下标访问。它的设计哲学就是“只暴露必要接口”,所以很多你以为该有的功能,它真没有。
常见错误现象:试图写 for (int i = 0; i ,编译直接报错;或者用 <code>q.begin() 被拒。
- 初始化可来自同类型 queue:
queue<int> q2 = q1;;也可用底层容器构造:queue<int, deque<int>> q(deque<int>{1,2,3}); - 只支持的操作:
empty()、size()、front()、back()、push()、pop() - 兼容性注意:C++11 起支持移动语义,
push(std::move(x))对大对象更友好;但front()返回引用,移动后原对象状态不确定,别依赖
替代方案:什么时候该换掉 std::queue
当你需要遍历、查找、中间插入、或按优先级出队,std::queue 就不是合适工具。它太薄了,不是缺陷,是定位明确。
常见错误现象:硬用 queue 实现优先队列(结果自己排序再塞进去),或者每次 pop 后遍历剩余元素找最大值。
- 要排序出队 → 用
std::priority_queue(注意默认是大顶堆) - 要遍历或随机访问 → 改用
std::deque或std::vector,自己维护头尾索引 - 要线程安全 →
std::queue本身不带锁,得外层加std::mutex,或用第三方无锁队列(如 moodycamel::ConcurrentQueue)
最常被忽略的一点:queue 的 size() 在多线程下无意义——调用瞬间可能已被其他线程改写,别拿它做循环条件。


















