Stack和Queue容器适配器:

我们今天来看一下栈和队列:

我们看这个,我们之前学习的list,我们的库里面的list的参数class后面是内存池,但是栈里面的参数class后面跟的是一个容器;

我们的Stack栈与队列Queue,这两个和我们之前学习的string,vector,list不一样,他们几个是容器,我们的Stack和Queue是容器适配器;

我们的队列和栈一样,都是容器适配器,第二个参数不是内存池,是我们的容器;

我们之前学习我们的容器的时候,因为我们为了避免频繁的向内存空间申请内存,我们就设立一个内存池,当我们需要内存空间的时候,我们就先向我们的内存池申请内存空间。

问题:

1. 我们的这个函数的第二个参数为什么是一个容器而不是我们的内存池呢?

因为我们的容器适配器并不像我们的其他的容器(vector,list)那样可以独立的存储数据,我们的容器适配器需要依赖我们的容器来帮助他存储数据。

2. 什么是容器适配器呢?

我们看一下这个图片:

首先是我们的容器,这个是我们存储数据使用的;

然后是迭代器,迭代器是我们在不需要了解我们的底层结构的条件下,访问我们的容器;

我们的迭代器提供了统一的访问容器的方式,封装屏蔽底层差异和实现细节;

然后是适配器:

容器适配器:

容器适配器(Container Adaptors)是 C++ 标准模板库(STL)中的一类容器,它们是对其他容器进行包装,以提供特定的接口和行为。容器适配器并不像其他容器(如vectorlist)那样独立存储元素,而是依赖于其他容器来帮助他存储数据。C++ STL 中有三种主要的容器适配器:stack(栈)、queue(队列)和priority_queue(优先队列)。

这个就是我们的栈和队列及其里面的接口,

我们现在来实现一下我们的Stack的底层:

那我们再来实现一下我们的queue的底层,我们说我们的容器适配器Stack的实现我们可以是通过vector来存储,也可以是通过list来存储,但是对于我们的容器适配器queue,我们最好只能是通过list来进行存储,因为队列的话,他是尾进头出的,那么对于vector来说的话,他就要进行头删,这个效率是比较低的,所以我们的容器适配器queue不依赖vector来实现,只用list。

我们的这个queue容器适配器,依赖list实现了尾删头插。

我们的容器适配器没有提供迭代器。

我们看我们上面的图片,我们的两个容器适配器的容器传过来的都可以是list,但是我们的函数的第二个参数的缺省值没有使用list作为我们的缺省值,而是使用了deque这个容器;

在我们讲解deque之前,我们看一下vector和list的优点和缺点:

 

vector和list的优点和缺点:

我们观察我们的这两个容器,他们的优点和缺点几乎就是互补的。

有人就在这里设置了一个新的容器,既有vector的优点,也有list的优点。

deque:

在 C++ 里,std::deque(double-ended queue,即双端队列)是标准模板库(STL)中的一个容器,它融合了向量(std::vector)和列表(std::list)的部分特性。

我们看这个容器里面的接口,尾插尾删可以满足容器适配器Stack的要求,尾插头删可以满足Queue的要求,看起来这个容器好像看起来能替代vector和list。

首先我们的结论是,deque取代不了我们的vector和list。

我们来看这个,我们的一个一个的小的数组buffer来存储我们的数据,buffer满了以后开辟一个新的buffer,满了以后开辟新的,然后我们设置一个中控数组,这个数组是一个指针数组,是用来存放我们的buffer指针的。

这个就是我们的deque,它既不是完全的连续的状态,也不是一个一个的空间状态,选择了一个中间的路线,这个扩容的话,就是我们的中控数组进行扩容。

特点:

复杂度分析:

我们的deque对于头部和尾部的插入和删除的效率是比较高的,但是中间位置的数据的插入和删除的效率是比较低的。

总结:

优先级队列:

使用我们的优先级队列的话,我们直接包含queue的头文件就可以了,我们的优先级队列也包含在里面了。

我们的优先级队列也是一个容器适配器,我们的第二个传过来的容器的缺省值是我们的vector<T>;

我们这里不使用deque来作为缺省值,他的方括号[]的效率没有vector高。

我们看一下他的接口:

我们这里的接口top和pop比较特殊,我们的top取数据,取的是优先级高的,pop接口,删除的是优先级高的数据。

我们这里打印出来的结果是: 6  5  5  2  1;

我们的容器适配器是不提供迭代器的,我们这里使用while循环和优先级队列里面的接口来实现;

我们的top()接口取到的就是我们的优先级高的数据,我们的默认是大的数据优先级高;

这个底层其实就是一个堆,所以我们排出来的就是一个从大到小的数据。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值