容器适配器概述
STL 中的 stack 和 queue 本质是容器适配器,它们基于基础容器封装实现特定操作逻辑。理解它们的底层机制,有助于我们更好地掌握 STL 设计思想。
什么是容器适配器?
适配器可以理解为'转换器',它能把原本不兼容的对象改造为可以直接使用的形式。容器适配器专门用来包装底层容器(例如 deque、vector),通过屏蔽复杂接口,只暴露栈、队列等特定数据结构的核心操作。
为什么不支持迭代器?
容器适配器的核心目标是限制访问范围:
- stack:仅允许操作栈顶(LIFO),若暴露迭代器,用户就能遍历所有元素,破坏设计意图。
- queue:仅允许操作队首/队尾(FIFO),迭代器会打破两端操作的限制。
- priority_queue:仅允许操作优先级最高的元素,底层存储顺序并非优先级顺序,遍历无意义。
因此,迭代器这种'通用遍历'工具与适配器'限制访问'的目标相悖,二者天生不兼容。
Stack 详解
核心概念
Stack 是一种后进先出(LIFO)的容器适配器。元素的插入和提取只能在容器的一端进行,通常将底层容器的尾部当作栈顶。
它对底层容器的要求包括:empty、back、push_back、pop_back。默认情况下使用 deque,但 vector 和 list 也符合要求。
模拟实现
namespace bit {
template<class T, class Container = std::deque<T>>
class stack {
public:
// 压栈:将 x 插入栈顶
void push(const T& x) { _con.push_back(x); }
// 出栈:删除栈顶元素
void pop() { _con.pop_back(); }
// 获取栈顶元素:返回 const 引用避免拷贝
const T& top() { return _con.back(); }
// 判断是否为空
bool empty { _con.(); }
{ _con.(); }
:
Container _con;
};
}


