C++修炼之路之STL_stack,queue和容器适配器

目录

前言 

一:SLT中stack和queue的基本使用

1.在官网中对stack和queue的简单介绍

2.数据结构中栈和队列的基本知识和操作 

3. STL中stack的接口函数及使用

4.STL中queue的接口函数及使用 

二:容器适配器Container 

三:使用容器适配器来模拟实现stack和queue

1.stack的模拟实现

2.queue的模拟实现

3.stack和queue默认容器适配器deque

1.deque(双端队列):是一种双开口的连续空间的数据结构,和vector和list一样都是容器,但和liat相比它支持头尾两端进行插入和删除操作,空间利用率高,支持下标的随机访问,和vector相比头插效率高,不需要挪动数据

2.结构与list,vector的关系​编辑

 3.接口函数及说明(只需了解)

4.了解底层结构 

5.deque的不足和缺陷 

6.deque被选择当默认容器的原因 

四:本篇内容相关代码连接



接下来的日子会顺顺利利,万事胜意,生活明朗-----------林辞忧

前言 

在经过数据结构的栈和队列的了解后,在c++的STL中也实现了栈和队列,相对于数据结构部分的栈和队列,在c++中栈和队列的底层实现结构中加入了容器适配器的知识,使其可以更好的复用list和vector中的操作来模拟实现栈和队列

一:SLT中stack和queue的基本使用

1.在官网中对stack和queue的简单介绍

对于容器适配器将在后面模拟实现时说明

2.数据结构中栈和队列的基本知识和操作 

如有不懂可以点击链接参考下面的文章

https://blog.csdn.net/Miwll/article/details/136610477?spm=1001.2014.3001.5501

3. STL中stack的接口函数及使用

演示代码: 

#include <iostream>
#include <stack>
#include <queue>
using namespace std;
int main()
{
	stack<int> st;
	st.push(1);
	st.push(2);
	st.push(3);
	st.push(4);
	st.push(5);
	st.push(6);
	cout << st.size() << endl;
	while (!st.empty())
	{
		cout << st.top() << " ";
		st.pop();
	}
	cout << endl;
	return 0;
}

4.STL中queue的接口函数及使用 

代码演示:

queue<int> q;
q.push(1);
q.push(2);
q.push(3);
q.push(4);
q.push(5);
q.push(6);//队尾入数据
while (!q.empty())
{
	cout << q.front() << " ";//对头出数据
	q.pop();
}
cout << endl;

二:容器适配器Container 

1.适配器就是一种设计模式,将一个类的接口转换为另一个接口

2.从上面对stack和queue的简单介绍中可以看出,他俩不属于容器,而是容器适配器,就是将其他容器如list和vector的函数接口进行封装直接提供给stack和queue使用,默认的容器适配器是deque(稍后简单介绍)

3.在前面的list的模拟实现的最后也提到了Container容器来打印不同数据类型的数据,如

三:使用容器适配器来模拟实现stack和queue

1.stack的模拟实现

#pragma once
namespace mjw
{
	template<class T,class Container=deque<T>>//容器适配器给的缺省值为deque
	class stack
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}
		void pop()
		{
			_con.pop_back();
		}
		const T& top()
		{
			return _con.back();
		}
		bool empty()
		{
			return _con.empty();
		}
		size_t  size()
		{
			return _con.size();
		}

	private:
		Container _con;
	};
}

使用容器Container 来的实现的过程就是使用模板,将使用vector或list在stack来调用他们的接口函数来模拟实现stack,再次体现了c++的封装特性

2.queue的模拟实现

#pragma once
namespace mjw
{
	template<class T, class Container = deque<T>>
	class queue
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}
		void pop()
		{
			_con.pop_front();
		}
		bool empty()
		{
			return _con.empty();
		}
		const T& front()
		{
			return _con.front();
		}
		const T& back()
		{
			return _con.back();
		}
		size_t size()
		{
			return _con.size();
		}
	private:
		Container _con;
	};
}

这里不能使用vector,原因是vector不支持pop_front()接口函数

3.stack和queue默认容器适配器deque

1.deque(双端队列):是一种双开口的连续空间的数据结构,和vector和list一样都是容器,但和liat相比它支持头尾两端进行插入和删除操作,空间利用率高,支持下标的随机访问,和vector相比头插效率高,不需要挪动数据
2.结构与list,vector的关系

 3.接口函数及说明(只需了解)

4.了解底层结构 

deque实际不是真正的连续空间,而是由每一段连续的小空间连接而成的,实际结构是一个中控数组,就是个指针数组

对于deque 的插入操作其实当中控数组都满了后,进行扩容再插入,一般对于中间位置的插入是整体挪动数据,不改变中控数组的大小,这样便于[]的访问

5.deque的不足和缺陷 

deque和vector相比,头部插入和删除时,不需要挪动数据,而且效率高,在扩容时不需要大量挪动数据,但效率还是vector好

与list相比,空间连续,空间的利用率高,支持下标的随机访问

但deque不适合遍历,在遍历时,deque的迭代器要频繁的去检测是否挪动到边界,导致效率低下,所以大多数情况下还是使用list和vector

6.deque被选择当默认容器的原因 

1.stack和queue不需要遍历,不用迭代器

2.在stack和queue中元素增长时,deque比vector的效率高

四:本篇内容相关代码连接

https://gitee.com/lin-ciyu/cplusplus/tree/master/STL_stack_queue/STL_stack_queue

感谢观看,期待与你的再次相会

  • 22
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值