容器适配器(以stack和queue为例)
引言
常见的容器适配器有stack、queueh和priority_queue,它们与vector、list这些容器不同,不是独立的容器,而是基于其他容器实现的。也就是说,它们是对现有的容器接口进行改造,提供新的功能。比如stack是后进先出,而queue是先进后出。那容器适配器的定义应该就是通过封装已有的容器,改变其接口,使其符合特定的数据结构行为。
一、容器适配器概念
定义
基于现有容器实现的特殊数据结构,通过调整接口实现特定行为。
特点
- 不独立管理元素,依赖底层容器存储。
- 通过限制/扩展接口提供新的数据访问方式。
- 遵循适配器设计模式。
常见适配器
stack、queue、priority_queue
二、实现原理
以简化的stack适配器实现为例:
template <class T, class Container = vector<T>>
class stack {
private:
Container c; // 底层容器
public:
void push(const T& value) { c.push_back(value); }
void pop() { c.pop_back(); }
T& top() { return c.back(); }
bool empty() const { return c.empty(); }
size_type size() const { return c.size(); }
};
三、核心特点
1.接口限制
- stack:仅暴露push/pop/top
- queue:只允许front/back访问
2.底层容器要求
适配器 | 必须操作 | 默认容器 | 可用容器 |
stack | push_back,pop_back | deque | vector,list,deque |
queue | push_back,pop_front | deque | list,deque |
3.模板参数
template <class T, class Container = deque<T>>
class stack;
四、示例代码(不同容器的实现)
// 使用vector作为stack底层
std::stack<int, std::vector<int>> s;
s.push(1);
s.push(2);
std::cout << s.top(); // 输出2
// 使用list作为queue底层
std::queue<char, std::list<char>> q;
q.push('a');
q.push('b');
std::cout << q.front(); // 输出a
五、设计优势
- 代码复用:重用现有容器实现。
- 接口统一:不同容器底层表现一致行为。
- 灵活性:可自由选择容器底层
- 安全性:隐藏不相关操作