前言
前面实现了string和vector,理所应当就该轮到stack和queue啦,本篇还会涉及到一个比较重要且听起来很厉害的概念——适配器模式
适配器模式
在之前数据结构初阶的学习过程中,我们学习的栈是由数组加上一些限制组成的容器,底层本质还是一个数组
队列则是由数组或者链表组成都行,再稍加一些限制
所以这里stack,queue的实现也应该复用一下之前学的vector和list
那么该怎么复用呢?模板的魅力在这里又体现出来了
这里通过两个模板参数,T代表一个空间所存的数据类型,Container代表要复用的数据容器
STL库里是用deque去实现stack和queue的,但是我们可以传vector或者list去改变底层容器
比如:stack< int,vector<int> > queue< int,list<int> >
下面这两种虽然看起来和STL库里实现的一样,但是底层容器却已经是天差地别了
我们把这种模式就叫做适配器模式——本质其实也就是复用
这是本篇最为核心的知识,了解完这些后,实现其实也就是复用底层容器的函数接口罢了,没啥重点
stack自我实现
template<class T, class Container = deque<T> >
class stack
{
private:
Container _con;
public:
void push(const T& x)
{
_con.push_back(x);
}
void pop()
{
_con.pop_back();
}
T& top()
{
return _con.back();
}
const T& top()const
{
return _con.back();
}
size_t size()
{
return _con.size();
}
bool empty()
{
return _con.empty();
}
};
queue自我实现
template<class T,class Container=deque<T>>
class queue
{
private:
Container _con;
public:
void push(const T&x)
{
_con.push_back(x);
}
void pop()
{
_con.pop_front();
}
T& ftont()
{
return _con.front();
}
const T& ftont()const
{
return _con.front();
}
T& back()
{
return _con.back();
}
const T& back()const
{
return _con.back();
}
bool empty()
{
return _con.empty();
}
};
———————————————————————————————————————————
本文最重要的是去感悟所谓的适配器(复用),在后续的priority queue和反向迭代器的实现中也穿插了很多这种思想,可以减少代码的冗余性
希望对大家能有所帮助,也会继续输入c++相关知识