std::queue 的 push(x) 在队尾插入元素,pop() 移除队首元素且不返回值,front()/back() 分别访问队首/队尾;需先 front() 再 pop() 获取并移除,存指针或自定义类型时注意生命周期与拷贝语义。

queue 的基本 push 和 pop 操作怎么写
标准 std::queue 是适配器容器,默认底层用 std::deque,不支持随机访问,只允许在队尾入队、队首出队。
必须包含头文件 ,声明方式为 std::queue,其中 T 是元素类型。
-
push(x):将x插入队尾,无返回值,时间复杂度 O(1) -
pop():移除队首元素,不返回值(注意:不是返回被删元素),O(1) -
front()和back()才用于访问元素,分别返回队首/队尾的引用,调用前必须确保非空
为什么 pop() 不返回值,而 front() 要单独调用
这是 C++ 标准库的设计选择:分离“访问”和“修改”,避免异常安全问题。如果 pop() 同时返回值,在移动语义下可能引发资源泄漏或异常中断后的状态不一致。
常见误写:
立即学习“C++免费学习笔记(深入)”;
int x = q.pop(); // 错误!pop() 返回 void
正确写法是两步:
int x = q.front();
q.pop();
若需原子性获取并移除,可封装成函数,但要注意多线程下仍需加锁。
queue 里能存指针或自定义类型吗
可以,但要注意生命周期和深拷贝问题:
- 存裸指针(如
std::queue)没问题,但指向的对象必须在队列存在期间有效 - 存智能指针(如
std::queue<:unique_ptr>>)更安全,移动语义自动处理所有权 - 存自定义类对象时,该类需提供默认构造函数、拷贝/移动构造函数;若涉及资源管理,要检查是否满足强异常安全保证
例如,若类中含 std::vector 成员,push 过程会触发复制或移动,性能取决于其移动构造是否 noexcept。
用 list 或 vector 替代 queue 有哪些坑
有人想手动用 std::list 或 std::vector 模拟队列,但容易忽略关键约束:
-
std::vector::pop_front()不存在 —— 只有pop_back(),前端删除是 O(n) 操作 -
std::list支持push_back()和pop_front(),但直接暴露迭代器和中间操作,破坏了 FIFO 抽象,也失去适配器对操作的封装保障 -
std::queue不提供size()以外的容量查询接口(如capacity()),而底层deque实际有分段内存结构,频繁小对象 push 可能导致额外分配开销
除非有特殊需求(比如需要遍历中间元素),否则别绕过 std::queue 自己实现。










