前面实现了string和vector,理所应当就该轮到stack和queue啦,本篇还会涉及到一个比较重要且听起来很厉害的概念——适配器模式
在之前数据结构初阶的学习过程中,我们学习的栈是由数组加上一些限制组成的容器,底层本质还是一个数组
队列则是由数组或者链表组成都行,再稍加一些限制
所以这里stack,queue的实现也应该复用一下之前学的vector和list
那么该怎么复用呢?模板的魅力在这里又体现出来了
这里通过两个模板参数,T代表一个空间所存的数据类型,Container代表要复用的数据容器
STL库里是用deque去实现stack和queue的,但是我们可以传vector或者list去改变底层容器
比如:stack< int,vector
下面这两种虽然看起来和STL库里实现的一样,但是底层容器却已经是天差地别了
我们把这种模式就叫做适配器模式——本质其实也就是复用
这是本篇最为核心的知识,了解完这些后,实现其实也就是复用底层容器的函数接口罢了,没啥重点
- template<class T, class Container = deque
> - 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();
- }
-
- };
- template<class T,class Container=deque
> - 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++相关知识