queue和stack是C++容器适配器,基于deque等容器封装,分别实现FIFO和LIFO语义;queue支持push/pop/front/back,stack支持push/pop/top;均无迭代器、不支持随机访问,且pop不返回值。

在 C++ 标准库中,queue 和 stack 是容器适配器(container adapters),不是独立的底层数据结构,而是基于其他容器(如 deque、vector 或 list)封装而成,提供了受限的接口:只允许在特定位置插入/删除元素,符合队列(FIFO)和栈(LIFO)的逻辑。
如何使用 std::queue(队列)
std::queue 默认底层使用 std::deque,支持在队尾入队(push)、队首出队(pop),并可通过 front() 和 back() 访问首尾元素。它不提供迭代器,也不能随机访问。
基本用法示例:
- 包含头文件:
#include <queue> - 声明:例如
std::queue<int> q;(默认基于 deque) - 常用操作:
-
q.push(x):将 x 入队(队尾) -
q.front():访问队首元素(不移除) -
q.back():访问队尾元素(不移除) -
q.pop():移除队首元素(不返回值) -
q.empty()、q.size():判断空、获取长度
-
- 注意:
front()和pop()必须在非空时调用,否则行为未定义;建议先用empty()检查
如何使用 std::stack(栈)
std::stack 同样是容器适配器,默认底层也用 std::deque,仅暴露栈顶操作:压栈(push)、弹栈(pop)、访问栈顶(top)。
立即学习“C++免费学习笔记(深入)”;
基本用法示例:
- 包含头文件:
#include <stack> - 声明:例如
std::stack<char> s; - 常用操作:
-
s.push(x):x 压入栈顶 -
s.top():访问栈顶元素(不移除) -
s.pop():移除栈顶元素(不返回值) -
s.empty()、s.size():判空、查大小
-
- 注意:
top()和pop()都要求栈非空;top()返回的是引用,可读可写(若元素类型允许)
自定义底层容器(进阶用法)
你可以显式指定底层容器,从而影响性能或内存特性。例如:
-
std::queue<int, std::list<int>> q_list;:用 list 实现 queue(适合频繁插入删除但对缓存不敏感的场景) -
std::stack<double, std::vector<double>> s_vec;:用 vector 实现 stack(连续内存,cache 友好,但扩容有代价) - 注意:所选容器必须支持必要操作,比如
queue要求容器有push_back和pop_front,所以vector不能直接用于queue(缺少pop_front)
常见误区与提醒
初学者容易混淆的点:
-
queue和stack不是“可以遍历的容器”,没有begin()/end(),也不支持下标访问 -
pop()系列函数都不返回值——想获取再删除,需先front()/top(),再pop() - 它们不提供查找、排序、去重等功能,这些需自行处理或换用其他容器(如
vector+ 算法) - 多线程环境下,标准库容器本身不保证线程安全;如需并发访问,应加锁或使用专用并发结构
掌握这两个适配器的关键是理解“接口限制”背后的意图:让代码更清晰地表达 FIFO 或 LIFO 的业务语义,而不是纠结于底层实现。用对了,能显著提升逻辑可读性和维护性。










