1. 从零理解STL容器适配器设计哲学
在C++标准模板库(STL)中,stack和queue常被称为"容器适配器"而非独立容器。这种设计背后隐藏着精妙的思想:它们不是重新造轮子,而是在现有容器基础上通过接口限制实现的。我最初学习时曾困惑为什么它们没有自己的完整实现,直到自己动手重写才明白这种设计的优雅之处。
容器适配器的核心特征是"用底层容器干活,自己只做规矩"。比如stack默认使用deque作为底层容器,但严格限制只能在一端操作;queue同样基于deque,但要求一端进一端出。这种设计带来三个显著优势:
- 避免重复实现底层内存管理
- 保持接口简洁专一
- 允许用户灵活更换底层容器
关键认知:stack和queue本质上是对其他容器的行为约束器,这种认知会直接影响我们的实现方式
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. stack的完整实现与关键操作
2.1 基础框架搭建
我们先从stack开始,标准的stack需要提供以下核心接口:
- push() 入栈
- pop() 出栈
- top() 访问栈顶
- empty() 判空
- size() 获取元素数量
cpp复制template<typename T, typename Container = std::deque<T>>
class Stack {
private:
Container c; // 底层容器
public:
// 类型别名
using value_type = typename Container::value_type;
using size_type = typename Container::size_type;
using reference = typename Container::reference;
using const_reference = typename Container::const_reference;
// 构造函数
Stack() = default;
explicit Stack(const Container& cont) : c(cont) {}
explicit Stack(Container&& cont) : c(std::move(cont)) {}
// 核心接口实现...
};
这里有几个值得注意的设计点:
- 模板参数允许指定底层容器,默认使用deque
- 使用标准化的类型别名,保持与STL一致性
- 提供移动语义构造函数
2.2 关键操作实现细节
push()操作的实现需要考虑异常安全:
cpp复制void push(const value_type& value) {
c.p
