STL详解——stack以及queue的模拟实现

目录

容器适配器

stack的模拟实现

构造函数

其他功能

queue的模拟实现

由于stack以及queue的很多功能是基于其他容器的接口实现的,同时功能比较简单,所以我们在本文直接进行上述两个结构的模拟实现。

容器适配器

在上一篇文章中,我们只是简单提到了容器适配器,本文需要进行模拟实现就需要我们对容器适配器有一个深入的的理解,所以我们再详细地说说。

我们在查看官方的文档时,可以看到stack、queue被成为容器适配器,因为stack和queue只是对其他容器的接口进行了包装,STL中stack和queue默认使用deque容器,因为我们给了默认参数。

在stack和queue的类 模板声明当中我们就可以看到,它们的模板参数有两个,第一个是stack和queue当中所存储的元素类型,而另一个就是指定使用的容器类型。只不过当我们不指定使用何种容器的情况下,stack和queue都默认使用deque作为指定容器。

简单理解: 学过数据结构后我们都知道,stack和queue既可以使用顺序表实现,也可以使用链表实现。在这里我们若是定义一个stack,并指定使用vector容器,则定义出来的stack实际上就是对vector容器进行了包装。

stack的模拟实现

知道了容器适配器后,stack的模拟实现就显得相当简单,我们只需要调用所指定容器的各个成员函数即可实现stack的各个函数接口。

构造函数

我们前面学习类与对象时知道,当参数类型为自定义类型时,当我们没有写构造函数时,编译器会自动调用自定义类型的构造函数。那对于stack来说,我们就不需要自己写构造函数,我们使用的容器有自己的构造函数

其他功能

cpp 复制代码
namespace mine//我们自己的命名空间
{
	template<class T,class Container=std::vector<T>>//先使用vector试试水
	class stack
	{
	public:
        //功能实现都是比较简单的,应该很容易就能看懂了
        //我们使用的接口,最好是几个容器都有的接口,否则会导致编译错误
		bool empty() const
		{
			return _con.size()==0;
		}
		void push(const T& val)
		{
			_con.push_back(val);
		}
		void pop()
		{
			_con.pop_back();
		}
		size_t size() const
		{
			return _con.size();
		}
		T& top() const
		{
			return _con.back();
		}
		void swap(stack& st)
		{
			_con.swap(st._con);
		}
	private:
		Container _con;
	};

}

接下来给出deque的版本,其实是没什么区别的,这里只是让读者更好理解

cpp 复制代码
namespace mine
{
	template<class T, class Container = std::deque<T>>
	class stack
	{
	public:
		bool empty() const
		{
			return _con.size() == 0;
		}
		size_t size() const
		{
			return _con.size();
		}
		T& top()
		{
			return _con.back();
		}
		const T& top() const
		{
			return _con.back();
		}
		void push(const T& val)
		{
			_con.push_back(val);
		}
		void pop()
		{
			_con.pop_back();
		}
		void swap(stack& x)
		{
			_con.swap(x._con);
		}
	private:
		Container _con;
	};
}

queue的模拟实现

我们需要实现的功能

cpp 复制代码
namespace mine
{
	template<class T,class Container=std::deque<T>>
	class queue
	{
	public:
		bool empty() const
		{
			return _con.empty();
		}
		size_t size() const
		{
			return _con.size();
		}
		void push(const T& val)
		{
			_con.push_back(val);
		}
		void pop()
		{
			_con.pop_front();
		}
		T& front()
		{
			return _con.front();
		}
		const T& front() const
		{
			return _con.front();
		}
		T& back()
		{
			return _con.back();
		}
		const T& back() const
		{
			return _con.back();
		}
		void swap(queue& que)
		{
			_con.swap(que._con);
		}
	private:
		Container _con;
	};
}
相关推荐
nice_lcj5201 小时前
ThreadLocal 入门:它是怎么隔离数据的、为什么会导致内存泄漏
java·开发语言·后端·面试·并发编程·内存泄漏·threadlocal
紧跟先前的步伐2 小时前
Go AI Agent 实战 28|Agent 的预算、超时与停止条件
开发语言·人工智能·后端·ai·golang
bksczm3 小时前
InnoDB 行格式详解:DYNAMIC / COMPACT / COMPRESSED / REDUNDANT
java·开发语言·数据库
春涧草茶3 小时前
慢就是快16-1协程
开发语言·前端·python
Dovis(誓平步青云)4 小时前
启元 T1 Pro 人机相声搭档:语音-触摸双通道的启元机器人节奏引擎设计
开发语言·前端·javascript·microsoft·交互
做科研的周师兄4 小时前
【R语言实战】MixSIAR 氢氧同位素水源解析全流程:从混合空间校验到贝叶斯 MCMC 收敛诊断(后附完整代码)
java·大数据·开发语言
闻缺陷则喜何志丹4 小时前
【C++特性】四种类型转
c++·算法·类型转换
.痞老板.5 小时前
java ee--计算机是如何工作的
java·开发语言·java-ee
奇树谦5 小时前
Qt Quick 图片加载与 GPU 纹理机制详解:QImage、QQuickTextureFactory、QSGTexture 与异步加载
开发语言·qt·系统架构
青梅味猪大肠5 小时前
【操作系统-60】临近适应算法
java·linux·开发语言·嵌入式硬件·算法·操作系统