【C++】STL中的容器适配器 stack queue 和 priority_queue 的模拟实现

这篇具有很好参考价值的文章主要介绍了【C++】STL中的容器适配器 stack queue 和 priority_queue 的模拟实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、容器适配器

1、什么是容器适配器

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

例如我们常见的充电器就是一种适配器,它将我们常用的220V交流电压转化为4,5V (或者其他更高的电压) 的直流电压来给我们的电子设备进行充电。

2、STL标准库中的容器适配器

虽然stackqueue priority_queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配

器,这是因为stack和队列只是对其他容器的接口进行了包装,STL中stackqueue默认使用dequepriority_queue默认使用了vector

【C++】STL中的容器适配器 stack queue 和 priority_queue 的模拟实现

【C++】STL中的容器适配器 stack queue 和 priority_queue 的模拟实现

【C++】STL中的容器适配器 stack queue 和 priority_queue 的模拟实现

二、stack的模拟实现

1、stack的简单介绍

相关文档
stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,但这些容器类应该支持以下操作:

  • empty:判空操作
  • back:获取尾部元素操作
  • push_back:尾部插入元素操作
  • pop_back:尾部删除元素操作

标准容器vectordequelist均符合这些需求,默认情况下,如果没有为stack指定特定的底层容器,默认情况下使用deque

2、栈的模拟实现

为了栈的通用性,这里我们使用模板来进行模拟栈,关于栈的底层容器这里我们选择vector来进行模拟实现。

template<class T, class Container = vector<T>>
class stack
{
public:
	//栈的插入
	void push(const T& val)
	{
		//使用底层容器中尾插函数进行插入,栈只能进行栈顶插入和删除
		_con.push_back(val);
	}
	//栈的删除
	void pop()
	{
		//使用底层容器中尾删函数进行插入,栈只能进行栈顶插入和删除
		_con.pop_back();
	}
	//获取栈顶元素
	T& top()
	{
		//返回底层容器中最后一个数据
		return _con.back();
	}
	//const 版本
	const T& top() const
	{
		return _con.back();
	}
	//获取数据个数
	size_t size() const
	{
		//返回底层容器中数据的个数
		return _con.size();
	}
	//判空函数
	bool empty() const
	{
		//对底层容器进行判空
		return _con.empty();
	}
private:
	//成员变量是一个容器创建的对象
	Container _con;
};

三、queue的模拟实现

1、queue的简单介绍

相关文档
queue底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:

  • empty:检测队列是否为空
  • size:返回队列中有效元素的个数
  • front:返回队头元素的引用
  • back:返回队尾元素的引用
  • push_back:在队列尾部入队列
  • pop_front:在队列头部出队列

标准容器类dequelist满足了这些要求。默认情况下,如果没有为queue实例化指定容器类,则使用标准容器deque

2、queue的模拟实现

为了queue的通用性,这里我们使用模板来进行模拟queue,关于queue的底层容器这里我们选择list来进行模拟实现。

template<class T, class Container = list<T>>
class queue
{
public:
	//队列的插入
	void push(const T& val)
	{
		//使用底层容器中尾插函数进行插入,队列只能进行队尾插入
		_com.push_back(val);
	}
	//队列的删除
	void pop()
	{
		//使用底层容器中头删函数进行删除,队列只能进行队头删除
		_com.pop_front();
	}
	//获取队头数据
	T& front()
	{
		//返回底层容器中第一个数据
		return _com.front();
	}
	//const版本
	const T& front() const
	{
		return _com.front();
	}
	//获取队尾数据
	T& back()
	{
		//返回底层容器中最后一个数据
		return _com.back();
	}
	//const版本
	const T& back() const
	{
		return _com.back();
	}
	//获取数据个数
	size_t size() const
	{
		//返回底层容器中数据的个数
		return _com.size();
	}
	//判空函数
	bool empty() const
	{
		//对底层容器进行判空
		return _com.empty();
	}
private:
	//成员变量是一个容器创建的对象
	Container _com;
};

四、priority_queue的模拟实现

1、priority_queue的简单介绍

相关文档
优先队列是一种容器适配器,它其实就是我们数据结构中的,默认情况下priority_queue是大堆。

priority_queue底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。容器应该可以通过随机访问迭代器访问,并支持以下操作:

  • empty:检测容器是否为空
  • size:返回容器中有效元素个数
  • front:返回容器中第一个元素的引用
  • push_back:在容器尾部插入元素
  • pop_back:删除容器尾部元素

标准容器类vectordeque满足这些需求。默认情况下,如果没有为特定的priority_queue类实例化指定容器类,则使用vector

2、priority_queue的模拟实现

与前面的栈与队列一样priority_queue前两个模板参数都类似,但是priority_queue要有第三个模板参数,这个参数表示按照什么方式进行比较,即建立大堆还是小堆。文章来源地址https://www.toymoban.com/news/detail-425692.html

//第三个参数是比较方式,需要传递一个仿函数来确定比较方式,默认传递的是less<T>,表示建大堆
template<class T, class Container = vector<T>, class Comper = less<T>>
class priority_queue
{
public:
	//获取堆顶数据
	const T& top() const
	{
		//返回底层容器的第一个数据
		return _con.front();
	}
	//获取数据个数
	size_t size() const
	{
		//返回底层容器的数据个数
		return _con.size();
	}
	//判空函数
	bool empty() const
	{
		//判断底层容器是否为空
		return _con.empty();
	}
	//堆的插入
	void push(const T& val)
	{
		//从尾部插入
		_con.push_back(val);
		int child = _con.size() - 1;
		//向上调整重新建堆
		AdjustUp(child);
	}
	//堆的删除
	void pop()
	{
		//检查堆是否为空
		assert(!_con.empty());
		//交换堆顶与最后一个数据
		swap(_con.front(), _con.back());
		//删除最后一个数据
		_con.pop_back();
		//从堆顶进行向下调整,重新建堆
		AdjustDown(0);
	}
	
private:
	//向上调整算法
	void AdjustUp(int child)
	{
		Comper com;
		int parent = (child - 1) / 2;
		while (child > 0)
		{
			//这里使用了仿函数来判断建立什么堆
			//比较的位置(_con[parent], _con[child])是不能换的!!!
			if (com(_con[parent], _con[child]))
			{
				swap(_con[parent], _con[child]);
				child = parent;
				parent = (child - 1) / 2;
			}
			else
			{
				break;
			}
		}
	}
	//向下调整算法
	void AdjustDown(int parent)
	{
		Comper com;
		//默认左孩子更符合建堆的要求
		int child = parent *2 + 1;
		while (child < _con.size())
		{
			if (child + 1 < _con.size() && Comper()(_con[child], _con[child + 1]))
			{
				++child;
			}

			if (com(_con[parent], _con[child]))
			{
				swap(_con[parent], _con[child]);
				parent = child;
				child = parent * 2 + 1;
			}
			else
			{
				break;
			}
		}
	}
	//成员变量是一个容器创建的对象
	Container _con;
};

到了这里,关于【C++】STL中的容器适配器 stack queue 和 priority_queue 的模拟实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 容器适配器---deque和STL ---stack queue priority_queue的模拟实现 C++

    目录 一、容器适配器 deque原理 deque的缺陷 deque的优势 二、stack的模拟实现  三、queue的模拟实现 四、优先级队列的模拟实现 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户

    2024年02月02日
    浏览(52)
  • STL: 容器适配器stack 与 queue

      目录 1.容器适配器 1.1 STL标准库中stack和queue的底层结构 1.2 deque的简单介绍(了解) 1.2.1 deque的原理介绍 1.2.2 deque的缺陷 1.2.3 为什么选择deque作为stack和queue的底层默认容器 2. stack的介绍和使用 2.1 stack的介绍  2.2 stack的使用 2.3 利用deque模拟实现stack 3.queue的介绍和使用 3.1 queue的

    2024年02月05日
    浏览(45)
  • 【STL】容器适配器stack和queue常见用法及模拟实现

    1.stack介绍及使用 1.1 stack的介绍 stack文档介绍 stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。 stack是作为容器适配器被实现的,容器适配器是使用特定容器类的封装对象作为其基础容器的类,提供一

    2024年02月06日
    浏览(44)
  • 【C++】容器适配器--stack&queue&deque

    设计模式 设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可用性,可维护性,可读性,稳健性以及安全性的解决方案 迭代器模式 迭代器模式(Iterator Pattern) :提供

    2023年04月10日
    浏览(46)
  • C++初阶:容器适配器介绍、stack和queue常用接口详解及模拟实现

    介绍完了list类的相关内容后:C++初阶:适合新手的手撕list(模拟实现list) 接下来进入新的篇章,stack和queue的介绍以及模拟: stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。 stack是作为容器适配器

    2024年02月19日
    浏览(41)
  • STL stack,queue,deque以及适配器

    下面是stack库中的接口函数,有了前面的基础,我们可以根据函数名得知函数的作用 函数 说明 stack() 构造空栈 empty() 判断栈是否为空 size() 返回栈中元素个数 top 返回栈顶元素 push() 将值从栈顶压入栈内 pop() 在栈顶出栈 栈其实就是一种特殊的 vector ,因此可以使用 vector 模拟实

    2024年02月10日
    浏览(39)
  • 【C++】STL——容器适配器priority_queue(优先级队列)详解 及 仿函数的介绍和使用

    这篇文章我们接着上一篇的内容,再来学一个STL里的容器适配器—— priority_queue (优先级队列) 1.1 priority_queue的介绍 我们上一篇文章学了 queue (队列),那优先级队列也是在 queue 里面的: 和 queue 一样, priority_queue 也是一个容器适配器,那他和 queue 有什么区别呢?我们一

    2024年02月07日
    浏览(42)
  • 【C++干货铺】适配器 | stack | queue

    ========================================================================= 个人主页点击直达: 小白不是程序媛 C++系列学习专栏: C++干货铺 代码仓库: Gitee ========================================================================= 目录 stack的介绍和使用 stack的介绍 stack的使用 queue的介绍和使用 queue的介绍 qu

    2024年02月05日
    浏览(44)
  • [C++] STL_priority_queue(优先级队列) 的使用及底层的模拟实现,容器适配器,deque的原理介绍

    priority_queue文档介绍 翻译: 1. 优先队列是一种 容器适配器 ,根据严格的弱排序标准, 它的第一个元素总是它所包含的元素中最大的。 2. 此上下文类似于 堆 , 在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。 3. 优先队列被实现为容器适配

    2024年02月04日
    浏览(41)
  • 【C++从入门到放弃】stack和queue的深度剖析及空间适配器的介绍

    🧑‍💻作者: @情话0.0 📝专栏:《C++从入门到放弃》 👦个人简介:一名双非编程菜鸟,在这里分享自己的编程学习笔记,欢迎大家的指正与点赞,谢谢!   此篇博客将谈及到的stack、queue和priority_queue都不是STL的标准容器,而是一种空间适配器。它是通过对一种容器进行

    2024年02月11日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包