std::queue需显式指定底层容器,默认为deque;vector因无pop_front()不可用;初始化为空队列直接声明即可;操作前须用empty()检查,不可随机访问或遍历。
怎么声明和初始化一个
不是所有“队列”都叫
——它只是适配器,底层必须指定容器。直接写
会编译失败,因为缺了底层容器模板参数。
默认用
,所以最常用的是:
(隐式等价于
);如果想换
或
,必须显式写出第二个模板参数:
原因:queue 要求底层容器提供
、
、
、
——
没有
,所以不能用。
别手滑写成
,报错信息通常是
性能上,
是默认最优解:两端操作均摊 O(1),比
更缓存友好
初始化空队列不需要额外操作,
就够了
和
的边界行为要小心
不返回值,只删头元素;想取值得先调
,再
。顺序反了或没检查是否为空,就是未定义行为。
立即学习
“
C++免费学习笔记(深入)
”;
常见崩溃场景:
在空队列上调用,或者
前没判空。
C知道
CSDN推出的一款AI技术问答工具
下载
永远先用
判断,再调
或
和
等价,但后者是常量时间,前者某些实现可能非 O(1)
没有
——那是
的函数,queue 只有
和
为什么不能用
或迭代器遍历
是容器适配器,故意不暴露底层数据结构的访问接口。它只保留 FIFO 必需的操作:入队、出队、查头尾、判空、查大小。
想遍历?说明你其实不需要 queue,该换
或
。
试图写
或
会编译失败:
如果真要“看中间元素”,要么改用
,要么把 queue 元素全倒出来(用临时容器暂存),但那就违背 queue 的设计意图了
调试时想打印内容?只能循环
+
,但注意这会清空原队列
多线程下直接用
是危险的
标准库所有容器都不保证线程安全。多个线程同时调
和
,不加锁就会数据竞争。
别指望
+
+
这三步是原子的——中间可能被其他线程插进来。
必须自己加互斥锁(比如
),且锁的粒度要覆盖整个“检查+操作”逻辑
更稳妥的做法是封装成线程安全队列类,内部管理锁和条件变量,用于生产者-消费者场景
别用
配
——读写锁对 queue 没意义,因为
和
都算写操作
实际用的时候,最常卡住的不是语法,而是想当然认为它支持随机访问,或者在多线程里裸奔。记住:queue 就是个严格守门的 FIFO 黑盒,越界伸手,它就给你报错或静默崩掉。
std::queuestd::queuequeuedequestd::queuestd::queue> vectorliststd::queue> q1; // 合法
std::queue> q2; // 编译失败:vector 不支持 pop_front() front()back()push_back()pop_front()vectorpop_front()queue> no member named 'pop_front'dequeliststd::queue q; push()pop()pop()front()pop()q.pop()q.front()q.empty()front()pop()q.size() == 0q.empty()q.top()priority_queuefront()back()operator[]std::queuestd::queuestd::dequestd::vectorq[0]for (auto it = q.begin(); ...)no member named 'begin'dequefront()pop()std::queuepush()pop()empty()front()pop()std::mutexstd::queuestd::shared_mutexfront()pop()