STL 容器适配器:Stack 与 Queue 的实现与题型应用
容器适配器是什么
在 C++ STL 里,stack 和 queue 不算传统意义上的容器,它们更像一层薄封装,外面只留下少量接口,底层还是依赖 deque、vector 这类标准容器。这样做的好处很直接:把访问方式收紧,只保留符合数据结构语义的操作。
为什么它们没有迭代器
原因其实不复杂:适配器的目的就是限制你怎么用,而不是让你随便遍历。
stack遵循 LIFO,只能碰栈顶。要是能随意遍历,栈的约束就被绕开了。queue遵循 FIFO,只允许队尾入队、队头出队。迭代器会把两端操作的边界冲淡。priority_queue更明显,底层是堆,内部顺序本身就不是优先级顺序,遍历出来也没什么业务价值。
所以这三类适配器都不提供迭代器。我觉得这是 STL 里很'克制'的设计,接口少一点,反而更不容易把语义用乱。
Stack 的核心逻辑和实现
设计思路
stack 是标准的后进先出结构,插入和删除都发生在同一端,也就是栈顶。作为适配器时,默认底层容器一般是 deque,也可以换成 vector 或 list,前提是它们要支持这些接口:
empty()back()push_back()pop_back()
代码实现
namespace bit {
// 模板类定义:T 为元素类型,Container 为底层容器(默认 deque<T>)
template<class T, class Container = std::deque<T>>
class stack {
public:
// 压栈:将元素插入到底层容器尾部
void push(const T& x) {
_con.push_back(x);
}
// 出栈:删除底层容器尾部元素
void pop() {
_con.pop_back();
}
// 获取栈顶元素:返回 const 引用,避免拷贝且防止外部修改
const T& top {
_con.();
}
{
_con.();
}
{
_con.();
}
:
Container _con;
};
}


