std::queue默认遵循FIFO语义,底层以deque实现,push()入尾、front()读头、pop()删头三者组合强制单向流动;误用vector作底层会使pop()退化为O(n),且必须配对使用front()与pop()并检查empty()以防未定义行为。

queue 默认就是先进先出,不用手动实现
标准库 std::queue 本身就是基于先进先出(FIFO)语义设计的容器适配器,底层默认用 std::deque 实现,所有接口(push()、front()、pop())天然保证 FIFO 行为。你不需要重写逻辑或模拟入队/出队顺序。
为什么 push + front + pop 就是 FIFO?
关键在于操作不可逆且分离:push() 只能加到尾部,front() 只能读头部,pop() 只能删头部。三者组合强制形成单向流动:
-
push(1)→ 队列:[1] -
push(2)→ 队列:[1, 2] -
front()返回 1,pop()后变成 [2] - 下一次
front()必然是 2 —— 顺序由插入位置和访问位置严格绑定
别用 vector 做底层,否则 pop() 会变慢
std::queue 允许指定底层容器,但选错会影响性能:
- 默认
std::deque:push()和pop()都是 O(1) - 若显式写成
std::queue<int std::vector>></int>:每次pop()要移动后续所有元素,退化为 O(n) - 编译器不会报错,但运行时延迟明显,尤其数据量大时
front() 和 pop() 必须配对使用,不能只调 pop()
pop() 不返回值,只删除头部;想取值必须先调 front()。常见错误写法:
立即学习“C++免费学习笔记(深入)”;
q.pop(); // 错!你不知道弹出的是什么 int x = q.pop(); // 错!pop() 返回 void
正确姿势永远是:
if (!q.empty()) {
int x = q.front(); // 先读
q.pop(); // 再删
}
漏掉 empty() 检查会导致未定义行为,调试时可能 crash 或读到垃圾值。


















