c++中的容器适配器是基于其他容器构建的封装类,提供特定接口实现常用数据结构行为。最常见的三个容器适配器是stack、queue和priority_queue。1. stack是后进先出(lifo)结构,默认使用deque实现,基本操作包括push、pop、top、empty和size;只能访问顶部元素,底层可更换为vector或list以优化内存开销。2. queue是先进先出(fifo)结构,默认也使用deque实现,基本操作包括push、pop、front、back、empty和size;适用于广度优先搜索和任务调度等场景,不支持随机访问或查找中间元素。3. priority_queue是内部维护堆结构的适配器,默认为最大堆,基本操作包括push、pop、top、empty和size;可自定义比较逻辑实现最小堆或其他排序方式,底层必须使用支持随机访问的容器如vector或deque;插入和删除复杂度为o(log n),不能修改中间元素以免破坏堆结构。此外,这三种适配器均不支持迭代器访问,选择合适底层容器和理解其限制对性能至关重要。

在 C++ 中,容器适配器(Container Adaptors)是基于其他容器(如 vector、deque 或 list)构建的封装类,提供了特定接口来实现常用的数据结构行为。最常见的三个容器适配器是 stack、queue 和 priority_queue。它们不提供迭代器访问元素,而是通过特定的操作方式来管理数据。

下面分别介绍这三个适配器的使用方法和注意事项,适合实际编程中快速查阅和应用。
stack:后进先出的数据结构
std::stack 是一个后进先出(LIFO)的容器适配器,默认底层使用 deque 实现,也可以指定为 vector 或 list。
立即学习“C++免费学习笔记(深入)”;

基本操作包括:
-
push():压入元素到栈顶 -
pop():弹出栈顶元素 -
top():访问栈顶元素(不删除) -
empty():判断是否为空 -
size():返回元素个数
#include <stack> std::stack<int> s; s.push(1); s.push(2); int top = s.top(); // 得到 2 s.pop(); // 弹出 2
注意点:

- 栈只能访问顶部元素,不能遍历
- 底层容器可以更换,比如
std::stack<int, std::vector<int>> s; - 如果频繁压栈且内存有限,考虑用
vector替代默认的deque,以减少分段内存开销
queue:先进先出的数据结构
std::queue 是一个先进先出(FIFO)的容器适配器,默认也使用 deque 实现。
基本操作有:
-
push():在队尾添加元素 -
pop():移除队首元素 -
front():访问队首元素 -
back():访问队尾元素 -
empty()/size():同 stack
#include <queue> std::queue<int> q; q.push(10); q.push(20); int first = q.front(); // 得到 10 q.pop(); // 移除 10
使用建议:
- 常用于广度优先搜索、任务调度等场景
- 默认底层是
deque,性能通常足够好 - 不支持随机访问,也不能直接清空或查找中间元素
priority_queue:带优先级的队列
std::priority_queue 是一个内部维护堆结构的容器适配器,默认是一个最大堆(大根堆),即每次取出的是当前最大的元素。
基本操作包括:
-
push():插入元素并调整堆 -
pop():移除堆顶元素 -
top():访问堆顶元素 -
empty()/size()
#include <queue> std::priority_queue<int> pq; pq.push(3); pq.push(1); pq.push(4); int max = pq.top(); // 得到 4 pq.pop();
自定义排序方式: 如果你想使用最小堆或者其他比较逻辑,可以通过传入比较函数对象来改变默认行为:
// 最小堆
std::priority_queue<int, std::vector<int>, std::greater<>> min_heap;
// 自定义结构体需要重载 operator<
struct Node {
int val;
bool operator<(const Node& other) const {
return val > other.val; // 小顶堆
}
};
std::priority_queue<Node> heap;注意细节:
- 插入和删除时间复杂度为 O(log n)
- 底层必须使用支持随机访问的容器,如
vector或deque - 没有
front()/back(),只有top()访问堆顶 - 不能修改中间元素,否则会破坏堆结构
总结一下常见误区和技巧
-
不要尝试对
stack、queue或priority_queue使用迭代器,它们本身不支持。 - 选择合适的底层容器很重要,特别是当性能敏感时。
- 优先队列的比较逻辑要小心定义,尤其是结构体类型。
- 如果你需要频繁查找中间值或者动态调整优先级,可能更适合自己实现堆结构或使用
set等结构。
基本上就这些内容了。这三者都是 STL 提供的封装,使用起来简单,但理解它们的行为和限制才能真正发挥其作用。










