c++中如何使用queue队列_c++ queue常用函数用法【实例】

12次阅读

std::queue 是底层默认基于 std::deque 的 FIFO 适配器容器,不支持随机访问与查找,仅提供 push/pop/front/back 等受限操作,空队列调用 front/pop 将导致未定义行为。

c++中如何使用queue队列_c++ queue常用函数用法【实例】

直接说结论:std::queuec++ 标准库提供的**适配器容器(adapter)**,底层默认用 std::deque 实现,不支持随机访问、遍历或查找,只提供 FIFO(先进先出)的受限操作。它不是“万能队列”,用错场景反而会踩坑。

如何正确声明和初始化 std::queue

必须显式指定元素类型,不能省略模板参数;不支持用花括号初始化(C++11 起部分编译器允许但非标准行为)。

  • std::queue 是合法声明;std::queue 单独写会编译失败
  • 底层容器可替换,例如:std::queue>(但注意 std::listfront()/back() 随机访问优化,性能可能下降)
  • 不能用 std::queue q = {1,2,3}; —— 这调用的是拷贝构造,不是 initializer_list 构造(std::queue 没定义该构造函数

push()pop()front()back() 的真实行为

这几个是核心操作,但要注意:它们都不检查空状态,空队列调用 front()pop() 是未定义行为(UB),不会抛异常,程序可能崩溃或静默出错。

  • push(x):在队尾插入副本(调用 T 的拷贝/移动构造),时间复杂度均摊 O(1)
  • pop():仅移除队首元素,不返回值 —— 想取值必须先 front(),再 pop()
  • front()back() 返回的是引用(T&),修改会影响队列中实际对象(若 T 是类类型且非 const
  • 没有 at()find()size() 以外的索引或搜索接口
std::queue q; q.push("hello"); q.push("world"); std::cout << q.front() << "n"; // 输出 "hello" q.pop(); std::cout << q.front() << "n"; // 输出 "world"

判断是否为空、获取长度、清空队列的可靠方式

empty()size() 是安全的,但注意:size() 在某些底层容器(如 std::list)上可能是 O(n),而默认 std::deque 是 O(1)。

立即学习C++免费学习笔记(深入)”;

  • 永远用 q.empty() 判断是否可安全调用 front(),别用 q.size() == 0 —— 语义更清晰,且避免 size 类型隐式转换问题
  • 没有内置清空函数,需循环 pop(),或利用作用域销毁:q = std::queue();(赋值构造新空队列)
  • swap() 可用于高效清空:std::queue().swap(q); —— 移动语义下几乎零开销

常见误用与替代建议

很多人想用 std::queue 做“带遍历的队列”或“优先级队列”,这属于类型误用。

  • 需要遍历?→ 改用 std::dequestd::vector,它们支持迭代器和下标
  • 需要按优先级出队?→ 用 std::priority_queue,不是 std::queue
  • 需要线程安全?→ std::queue 本身不提供任何同步机制,必须外加 std::mutex
  • 频繁 front+pop 组合?可封装成内联辅助函数避免重复判空

真正关键的一点:一旦你发现自己在反复调用 size() 做逻辑分支,或者试图用 for 循环遍历 std::queue,就该停下来换容器了 —— 它的设计哲学就是“只管进出,不管里面长什么样”。

text=ZqhQzanResources