STL 中的 stack 和 queue 本质是容器适配器,它们基于基础容器(如 vector、deque)封装,屏蔽复杂接口,只暴露特定操作逻辑。这种设计让我们能直接按栈或队列的经典逻辑使用数据,同时享受底层容器的性能优势。
容器适配器原理
适配器就像'转换器',把不兼容的对象改造为适配特定场景的形式。容器适配器包装底层容器,限制访问方式。例如 stack 遵循后进先出(LIFO),只允许在尾部操作;queue 遵循先进先出(FIFO),队尾入队、队头出队。priority_queue 则关注优先级最高的元素。正因为适配器限制了遍历权限以维护结构特性,所以它们不支持迭代器。
Stack 模拟实现
Stack 默认底层容器是 deque,也可以是 vector 或 list。核心要求是支持 empty、back、push_back、pop_back。
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 T& top() { return _con.back(); }
bool empty() { return _con.empty(); }
size_t size() { return _con.size(); }
private:
Container _con;
};
这里所有操作都委托给 _con。编译器会自动生成默认成员函数,因为 stack 本身不管理额外资源,底层容器已处理内存。注意 top() 返回 const 引用,防止外部修改栈顶数据。
Queue 模拟实现
Queue 需要支持 front、back、push_back、pop_front。默认也是 deque。
template<class T, class = std::deque<T>>
queue {
:
( T& x) { _con.(x); }
{ _con.(); }
{ _con.(); }
{ _con.(); }
{ _con.(); }
{ _con.(); }
:
Container _con;
};


