跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

C++怎么使用队列_C++queue容器教程【结构】

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

相关文章