前言
在本篇文章中,我们将会学到stack,queue的底层实现,我们通过本篇的学习,我们会发现,栈和队列的实现和vector,list等容器的实现会有很大差异。我们实现栈和队列是通过一种叫容器适配器的东西实现的。我们还将会学到deque,这是一种将list和vector结合的一种容器。我们来详细看一看吧!!!🌟🌟🌟
一、容器适配器
在介绍容器适配器之前,我们来想一下stack应该如何实现呢??
我们很清楚,栈是一种后进先出的结构,只能在一端进行数据的插入删除。
在c语言我们学习过,stack既可以用顺序表来实现,又可以用链表实现。
那么我们在C++中依然可以采用相同的方式来实现链式栈和顺序栈。
但是,我们发现在实现stack的接口中,很多都与顺序表的实现结构相似。
那麽我们把vector的一些接口进行封装,修改修改不就是我们stack的结构吗??
在C++官方库中,确实就是采用这种方法进行实现的。我们把这个叫做容器适配器
stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出
队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。
容器适配器是C++标准库中的一种数据结构,它可以将不同类型的容器(如vector、list、deque等)转换为另一种类型的容器。本质上,容器适配器是一种机制,能使某种容器的行为看起来像另外一种容器。这种转换提供了一种简单的方式来重新组织和访问数据,同时隐藏了底层容器的实现细节。容器适配器通常用于解决特定的问题或满足特定的需求。
二、stack的实现
我们现在已经知道实现stack采用容器适配器来实现,我们想实现一个链式栈,就采用list进行适配,我们想实现一个顺序栈,就采用vector进行适配。
vector适配缺点:容易造成空间浪费
list适配缺点:内存命中率较低
有没有一种两者兼有的结构呢??
我们来看一下stack库里的是如何实现的!!!
我们发现在进行适配时,默认采用了deque这个容器。
这其实是一个双端队列。尾插尾删效率很高,对于空间的浪费也没有那麽大,内存命中率也可以。我们先用这个实现一下,在后面我们再来详细看一下
template<class T,class con=deque<T>>
class stack
{
public:
void push(const T&val)
{
_con