前言
前面实现了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++相关知识