容器适配器(Container adapters)
作为 STL 六大组件之一,适配器(adapter) 承担着各个组件间的转换和灵活组合功能。适配器本质上是一种封装,将某些既有组件进行组合封装,以得到新组件或者实现新功能。将适配器应用于容器,则称其为容器适配器(container adapters)。容器适配器是对已有容器的封装,stack 和 queue 是 STL 中的两个容器适配器。
本文以C++泛型技法实现对 stack
和 queue
的构建,以体会适配器模式,关于栈和队列的性质请参考数据结构_栈和队列。
stack
结构和定义
在 SGI STL 中,stack 应该封装某个适配容器 Container
,并向外提供 stack 的相关接口,这个适配容器用户可以自行指定,默认为双端队列deque
。
template<typename T, typename Container = std::deque<T> >
class stack
{
private:
Container _con;//底层容器
public:
/*…………*/
};
构造&析构和内存管理
stack 的构造、析构和内存管理完全复用适配容器 _con 的构造、析构和内存管理,编译器生成的默认构造函数和默认析构函数即可完成 stack 的内存申请和释放,不必额外构建。
stack 的性质规定只有栈顶的元素可见,所以 stack 没有迭代器。
元素访问和操作
stack 的元素访问和操作完全复用 _con 的接口。
/*…………*/
public:
void push(const T& val)
{
_con.push_back(val);
}
void pop()
{
_con.pop_back();
}
bool empty()
{
return _con.empty();
}
T& top()
{
return _con.back();
}
size_t size()
{
return _con.size();
}
/*…………*/
queue
结构和定义
和 stack 一样,在 SGI STL 中,queue
应该封装某个适配容器 Container,并向外提供 queue 的相关接口,这个适配容器用户可以自行指定,默认为双端队列 deque。
template<typename T, typename Container = std::deque<T> >
class queue
{
private:
Container _con; //底层容器
public:
/*…………*/
};
构造&析构和内存管理
queue 的构造、析构和内存管理完全复用适配容器 _con 的构造、析构和内存管理,不需要额外构建构造函数和析构函数。
queue 的性质规定只有队头和队尾的元素可见,所以 queue 没有迭代器。
元素访问和操作
queue 的元素访问和操作完全复用 _con 的接口。
/*…………*/
public:
void push(const T& val)
{
_con.push_back(val);
}
void pop()
{
_con.pop_front();
}
bool empty()
{
return _con.empty();
}
T& front()
{
return _con.front();
}
T& back()
{
return _con.back();
}
size_t size()
{
return _con.size();
}
/*…………*/