【STL源码剖析】stack_queue底层模拟实现 | 什么是适配器?【超详细的底层注释和解释】

 今天博主继续带来STL源码剖析专栏的第四篇博客了!
今天带来stack和queue的模拟实现!
话不多说,直接进入我们今天的内容!


前言

那么这里博主先安利一下一些干货满满的专栏啦!

手撕数据结构https://blog.csdn.net/yu_cblog/category_11490888.html?spm=1001.2014.3001.5482这里包含了博主很多的数据结构学习上的总结,每一篇都是超级用心编写的,有兴趣的伙伴们都支持一下吧!
算法专栏https://blog.csdn.net/yu_cblog/category_11464817.html这里是STL源码剖析专栏,这个专栏将会持续更新STL各种容器的模拟实现。

STL源码剖析https://blog.csdn.net/yu_cblog/category_11983210.html?spm=1001.2014.3001.5482


什么是适配器?

适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。

比如std::stack,我们在使用的时候,可以取用vector适配,也可以用list适配。(其实stack在底层实现的时候会调用适配容器的push_back()和pop_back()等接口,只要适配容器具有这些接口,都可以当作适配器被调用!)

void test_stack() {
	//stack<int,vector<int>>st; //适配 -- 传一个vector<int>类型过去
	//stack<int, list<int>>st;
	//vector和list其实底层已经完全变样了 -- 但是还是可以正常使用的
	stack<int>st;
	st.push(1);
	st.push(2);
	st.push(3);
	st.push(4);
	st.push(5);

	while (!st.empty()) {
		cout << st.top() << endl;
		st.pop();
	}
}

STL里的stack和queue

虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配
器,这是因为stack和队列只是对其他容器的接口进行了包装,STL中stack和queue默认使用deque

std::deque

deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1)与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。
deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组,其底层结构如下图所示:

 dequeue的迭代器构造是非常复杂的结构,同时也不是我们学习的重点,博主在这里不展开专门讲双端队列了,但是优先队列是非常重要的结构,博主会在下一期博客进行详细讲解!双端队列迭代器示意图如下:

tips:图片来自百度图片

Mystack.h

#pragma once
#include<vector>
#include<deque>
using namespace std;


namespace yufc {
	//template<class T> //现在这个还不是适配器因为底层是写死的
	template<class T, class Container = deque<T>>
	class stack {
	public:
		//构造析构拷贝构造要不要写 -- 不用
		void push(const T& x) {
			_con.push_back(x);
		}
		void pop() {
			_con.pop_back();
		}
		T& top() {
			return _con.back();
		}
		bool empty() const {
			return _con.empty();
		}
		size_t size() const {
			return _con.size();
		}
	private:
		//vector<T>_con;
		Container _con;
		//我的Container到底是什么不重要,只需要它有这几个操作就行了
	};
}

//queue 双端队列
//1.支持任意位置的插入删除
//2.随机访问
//vector和list的合体 -- 看其实没有很牛 -- 外强中干

//优势:3D,头尾插入删除,随机访问
//设计缺陷:
//1.operator[]计算稍显复杂,大量使用性能下降
//2.中间插入删除效率不高
//3.迭代器会很复杂!


//优先级队列
//priority_queue

MyQueue.h

#pragma once

#include<vector>
#include<deque>
using namespace std;

namespace yufc {
	template<class T, class Container = deque<T>>
	class queue {
	public:
		void push(const T& x) {
			_con.push_back(x);
		}
		void pop() {
			_con.pop_front();
		}
		T& back() {
			return _con.back();
		}
		T& front() {
			return _con.front();
		}
		//const也可以补上
		bool empty() const {
			return _con.empty();
		}
		size_t size() const {
			return _con.size();
		}
	private:
		Container _con;
	};
}

尾声

看到这里,相信大家对stack和queue的模拟实现已经有一定的了解了!这些容器的模拟实现,是我们掌握STL的开始,后面,博主将会给大家带来优先队列、map、set、哈希等等STL容器的模拟实现,持续关注,订阅专栏,点赞收藏都是我创作的最大动力。

转载时请注明作者和出处。未经许可,请勿用于商业用途 )
更多文章请访问我的主页

@背包https://blog.csdn.net/Yu_Cblog?type=blog

posted @ 2022-10-16 22:22  背包Yu  阅读(2)  评论(0编辑  收藏  举报  来源