std::queue 声明用 std::queue q;,初始化支持列表但需注意非直接入队;pop 不返回值,须先 front 再 pop;无随机访问能力;size() 一般 O(1);自定义类型需满足移动构造。

queue 的基本声明和初始化写法
直接用 std::queue 就行,它默认底层用 std::deque,不用自己操心内存分配。别手贱写成 queue<int> q = queue<int>()</int></int>,多此一举;更别漏掉命名空间——queue 不是内置类型,没 std:: 就编译不过。
-
std::queue<int> q;</int>—— 最常用,空队列 -
std::queue<:string> q2{{"a", "b", "c"}};</:string>—— C++11 起支持初始化列表,但注意:这其实是先构造内部容器再移动,不是直接“批量入队” - 不能用
std::queue<int> q{1, 2, 3};</int>—— 编译错误,std::queue没有接受 initializer_list 的构造函数
push、front、pop 这三个操作的顺序不能错
这是新手最常崩的地方:pop() 不返回值,只删头元素;想取值必须先调 front(),再 pop()。反着来(比如先 pop() 再 front())会访问已销毁元素,行为未定义,Debug 模式下可能 crash,Release 下可能静默出错。
- 安全写法:
if (!q.empty()) { int x = q.front(); q.pop(); /* use x */ } - 别写
int x = q.pop();——pop()返回void,编译直接报错 - 也别在
empty()判断前就调front()—— 即使队列为空,front()也不检查,UB
为什么不能像 vector 那样用下标或迭代器遍历 queue
std::queue 是容器适配器,不是容器,它故意屏蔽了随机访问能力。它的设计目标就是 FIFO 抽象,不提供 operator[]、begin()/end() 或 size() 以外的访问接口。想“看中间元素”或“从尾往前取”,说明你选错了工具。
- 真要遍历?换
std::deque或std::vector,或者把数据先倒进另一个容器里处理 -
q.size()是 O(1),但某些老编译器(如早期 MSVC)实现里可能是 O(n),别在热循环里反复调 - 如果需要带索引的 FIFO + 随机查,考虑
std::deque自己维护头尾指针,别硬套queue
自定义类型入队要注意拷贝/移动语义
队列内部存储的是元素副本,所以你的类得能被拷贝或移动。如果类里有裸指针、文件句柄或独占资源,又没写移动构造函数,push() 可能触发浅拷贝,后续 pop() 后析构导致 double-free 或资源泄漏。
立即学习“C++免费学习笔记(深入)”;
- 优先用智能指针、
std::string、std::vector等自带 RAII 的成员 - 确认类满足
std::is_move_constructible_v<t></t>,否则 C++11 后可能退化为拷贝,性能差还容易出问题 - 测试时加个输出构造/析构日志:
MyClass() { std::cout ,观察 push/pop 期间调用了几次
C++ 的 queue 很轻量,但它的限制是设计使然,不是缺陷。越想绕过这些限制,越容易掉进更深的坑里。









