移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——8.stackqueuepriority_queue(模拟实现)

news2024/9/28 11:16:58

1.stack

可通过模板使用其他类来建立stack(如vector,list)

#include<vector>


namespace zone
{
	template<class T,class container>   //两个模板参数
	class stack
	{
	   public:

		   void push(const T& x)
		   {
			   it.push_back(x);  //使用it的pushback
		   }


		   void pop()
		   {
			   it.pop_back();  //使用it的popback
		   }

		   const T& top()
		   {
			   return it.back();    //使用it的back取栈顶
		   }

		   bool empty()
		   {
			   return it.empty();   //使用it的empty
		   }

		   size_t size()
		   {
			   return it.size();      //使用it的size
		   }

	  private:
		  container it;    //it可以是list,vector
	};

}

注意:

 能不能使用其他类来建立新的类取决于其他类已有的函数能否满足新的类的需求(如增查删改)

2.queue 

可通过模板使用其他类来建立stack(如vector,list)

#include<vector>
#include<list>


namespace space
{
	template<class T, class container>// 适配器!!!!!!!!!相当于用其他类(list,vector)来建立队列
	class queue
	{
	public:

		void push(const T& x)
		{
			it.push_back(x);
		}


		void pop()
		{
			//it.erase(it.begin());      //若container为vector或list
			it.pop_front();              //若container为list,这里只能用list,因为vector 没有pop_front()函数
		}

		const T& top()
		{
			return it.front();
		}

		bool empty()
		{
			return it.empty();
		}

		size_t size()
		{
			return it.size();
		}

	private:
		container it;
	};

}

特别注意:

 void pop()
        {
            it.erase(it.begin());      //若container为vector或list
            it.pop_front();              //若container为list,这里只能用list,因为vector 没有pop_front()函数
        }

test.cpp:

#include<iostream>
#include<vector>
#include<list>


using namespace std;

#include"stack.h"
#include"queue.h"

int main()
{
	/*zone::stack<int, vector<int>> arr;
	arr.push(1);
	arr.push(2);
	arr.push(3);
	arr.push(4);
	arr.push(5);
	int num = arr.size();
	for (int i = 0; i < num; i++)
	{
		cout << arr.top() << ' ';
		arr.pop();
	}*/

	
	space::queue<int, list<int>> arr;
	arr.push(1);
	arr.push(2);
	arr.push(3);
	arr.push(4);
	arr.push(5);
	int num = arr.size();
	for (int i = 0; i < num; i++)
	{
		cout << arr.top() << ' ';
		arr.pop();
	}
}

3.priority_queue 

3.1 priority_queue的本质

优先级队列本质为堆!!!!!!!!!!!!!!

3.2 模拟实现 

1.仿函数 

仿函数本质是类,目的是为了替代c语言中的函数指针

#include<vector>
#include<queue>

namespace zone
{
	template<class T>
	class less
	{
	   public:
		   bool operator()(const T& x, const T& y)
		   {
			   return x < y;
		   }
         
	};   //仿函数,判断大小

	template<class T>
	class greater
	{
	public:
		bool operator()(const T& x, const T& y)
		{
			return x > y;
		}

	};   //仿函数,判断大小


	template<class T, class container = vector<T>,class compare=less<int>>//这里传的都是类型,不是变量,只用于构建模板
	class priority_queue
	{
	   public:
		   priority_queue()
		   {}


		   template<class inputiterator>
		   priority_queue(inputiterator first, inputiterator last)
			   : arr(first, last)
		   {
			   for (int i = (arr.size() - 1 - 1 )/ 2; i >= 0; i--) //向下调整原地建堆
			   {
				   adjustdown(i);
			   }

		   }      //迭代器区间建堆



		   void adjustup(int child)
		   {
			   compare com;      //这里才是建立变量
			   int parent = (child-1)/2;
			   while (child > 0)
			   {
				   if (com(arr[child],arr[parent]))
				   {
					   swap(arr[parent], arr[child]);
					   child = parent;
					   parent = (child - 1) / 2;
				   }

				   else
				   {
					   break;
				   }

			   }

		   }

		   void adjustdown(int parent)
		   {
			   int child = 2 * parent + 1;
			   compare com;
			   while (child < arr.size())
			   {
				   if (child < arr.size() - 1 && com(arr[child + 1], arr[child]))
					   child++;
				   if (com(arr[child],arr[parent]))
				   {
					   swap(arr[parent], arr[child]);
					   parent = child;
					   child = 2 * parent + 1;
				   }

				   else
				   {
					   break;
				   }
			   }

		   }


		   void pop()   //删堆顶的数据
		   {
			   swap(arr[0], arr[arr.size() - 1]);
			   arr.pop_back();
			   adjustdown(0);
		   }


		   void push(const T& x)
		   {
			   arr.push_back(x);
			   adjustup(arr.size() - 1);
		   }



		   const T& top()  //取堆顶的数据
		   {
			   return arr[0];
		   }


		   bool empty()
		   {
			   return arr.empty();
		   }


		   size_t size()
		   {
			   return arr.size();
		   }


	  private:
		container arr;

	};


}

test.cpp:

#include<iostream>
//#include<vector>
//#include<queue>

using namespace std;

#include"priority_queue.h"

int main()
{
	//priority_queue<int> arr;
	//priority_queue<int> arr;    //std中的大堆
	priority_queue<int,vector<int>,greater<int>> arr;      //std中使用仿函数建立小堆
	arr.push(1);
	arr.push(5);
	arr.push(4);
	arr.push(7);
	arr.push(2);
	arr.push(8);
	arr.push(6);
	arr.push(3);


	while (!arr.empty())
	{
		cout << arr.top() << ' ';
		arr.pop();
	}


}

4.杂谈 

sort(a,a+8,greater<int>())                                                    //快速排序

zone::priority_queue<int,vector<int>,greater<int>> arr       //建立优先级队列

思考:为何调用函数用 greater<int>()建立优先级队列用greater<int>?

 解答:

1. greater<int>()是匿名对象greater<int>类型

2.函数传的是对象,可以自动实例化

3.优先级队列传的是类型,构建模板,得在类里面自己实例化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2089066.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】命令简介------迅速掌握Linux命令

目录 Linux 命令 &#x1f354; ls命令 &#x1f354; cd 和 pwd命令 &#x1f354; 相对路径和绝对路径 &#x1f354; 文件/文件夹的创建以及文件内容的浏览 &#x1f354; 文件的复制,移动和删除 &#x1f354; 文件的查找 &#x1f354; grep 和管道 &#x1f354…

Windows11安装SqlLite、Navicat Premium 15连接SqlLite、Springboot集成SqlLite

一、Windows11安装SqlLite 1、下载安装包 地址&#xff1a;SQLite Download Page 2、压缩包解压 3、配置系统环境变量 4、验证安装是否成功 打开命令提示符&#xff0c;输入 sqlite3 5、创建数据库文件 新建文件重命名为你想要的数据库名称&#xff0c;文件后缀改为.db 二、…

【微信小程序】如何触发按钮事件,例如调起微信客服

需求 实现一个如下图的效果, 点击客服按钮, 调起微信客服功能, 需要和button组合使用 效果图 实现思路 客服只能通过button按钮调起, 所以我们需要写一个button按钮, open-type“contact”, 然后把它隐藏起来。给客服图标加一个label, 设置for“btnId”, 这样点击图片就会触…

微服务即时通讯系统环境搭建(客户端)

微服务即时通讯系统环境搭建(客户端) 前言 今天开始&#xff0c;我们要开一个新坑&#xff0c;我们将它称作微服务即时通讯系统。说到即时通讯系统&#xff0c;大家肯定能想到如同“微信”这样的app。那么没错&#xff0c;这次这个项目就会像微信一样&#xff0c;当然功能肯定…

Linux(CentOS8)系统安装mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz

一、下载获取 mysql安装包&#xff1b; MySQL :: Download MySQL Community Server (Archived Versions) 二、安装步骤 1、切换到安装目录下&#xff0c;并解压 tar -zxvf mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz 2.移动解压后的文件并且重命名为mysql mv mysql-8.0.26…

Mybatis:基础巩固-DCL

目录 一、概述二、用户管理2.1 查询用户2.2 创建用户2.3 修改用户密码2.4 删除用户 三、权限控制3.1 查询权限3.2 赋予权限3.3 撤销权限 一、概述 DCL数据控制语言&#xff0c;用来管理数据库用户、控制数据库的访问和权限。简单来说就是可以让哪些用户可以访问哪些数据库。 二…

LiveQing视频点播流媒体RTMP推流服务功能-支持OBS推流摄像机RTMP推流支持无人机RTMP推流解决大疆无人机推流花屏问题完美解决大疆无人机花屏

LiveQing-支持OBS推流摄像机RTMP推流支持无人机RTMP推流解决大疆无人机推流花屏问题完美解决大疆无人机花屏 1、流媒体服务搭建2、推流工具准备3、创建鉴权直播间4、获取推流地址5、配置OBS推流6、推流及播放7、获取播放地址7.1 页面查看视频源地址7.2 接口查询 8、更多问题8.1…

黑屏环境下,如何利用OBD部署OceanBase企业版集群

一、前言 OBD&#xff0c;作为OceanBase官方推出的部署工具&#xff0c;显著简化了OB单机及集群的部署流程。此前&#xff0c;OBD能够支持对社区版OB进行一键部署&#xff0c;那OBD是否同样支持OB企业版的部署呢&#xff1f; 本文为大家介绍通过OBD&#xff0c;在OB企业版集群…

短视频矩阵系统怎么开发搭建使用?解决内容创作分发效率问题的工具系统

目录 前言 &#xff1a; 一、短视频矩阵系统开发目的 系统主要功能 二、怎么开发 前言 &#xff1a; 短视频矩阵系统是一种综合性的短视频营销工具&#xff0c;它集成了短视频创作、管理、分发、数据分析等多种功能于一体。 一、短视频矩阵系统开发目的 在帮助创作者和企…

C++中类的相关学习

动态内存分配和回收&#xff08;堆区&#xff09; C语言中动态内存分配和回收使用malloc函数和free函数完成的 C依旧可以使用上述的两个函数完成&#xff0c;动态内存分配和回收 C也可以使用两个关键字new和delete来完成动态内存的分配和回收 内存分配 单个申请 格式&…

Chapter 07 watch侦听器

欢迎大家订阅【Vue2Vue3】入门到实践 专栏&#xff0c;开启你的 Vue 学习之旅&#xff01; 文章目录 前言一、基本用法二、深度侦听 前言 在 Vue 中&#xff0c;watch 侦听器是一个非常实用的工具&#xff0c;用于处理自定义数据的变化。本文详细讲解了 watch 侦听器的基本用法…

Pytorch实现多层LSTM模型,并增加emdedding、Dropout、权重共享等优化

简述 本文是 Pytorch封装简单RNN模型&#xff0c;进行中文训练及文本预测 一文的延申&#xff0c;主要做以下改动&#xff1a; 1.将nn.RNN替换为nn.LSTM&#xff0c;并设置多层LSTM&#xff1a; 既然使用pytorch了&#xff0c;自然不需要手动实现多层&#xff0c;注意nn.RNN…

JVM1-初识JVM

目录 什么是JVM JVM的功能 解释和运行 内存管理 即时编译 Java性能低的主要原因和跨平台特性 常见的JVM 什么是JVM JVM 全称是 Java Virtual Machine&#xff0c;中文译名&#xff1a;Java虚拟机 JVM本质上是一个运行在计算机上的程序&#xff0c;它的职责是运行Java字…

AI大模型编写多线程并发框架(六十三):监听器优化·下

系列文章目录 文章目录 系列文章目录前言一、项目背景二、第十一轮对话-修正运行时数据三、修正任务计数器四、第十二轮对话-生成单元测试五、验证通过七、参考文章 前言 在这个充满技术创新的时代&#xff0c;AI大模型正成为开发者们的新宠。它们可以帮助我们完成从简单的问答…

C++,如何写单元测试用例?

文章目录 1. 概述1.1 什么是单元测试&#xff1f;1.2 为什么要做单元测试&#xff1f; 2. 写测试用例的方法3. 编写测试用例的通用原则3.1 目的性原则3.2 独立性原则3.3 可重复性原则3.4 小规模原则3.5 一致性原则3.6 自动化原则3.7 边界条件原则3.8 错误检测原则3.9 性能原则3…

西门子PLC控制激光读头,profient转Ethernet IP网关应用

在智能制造的浪潮下&#xff0c;企业对于生产线的灵活性、智能化水平以及数据交互能力提出了更高要求。西门子PLC以其高可靠性和丰富的功能模块&#xff0c;广泛应用于各种自动化生产线中。而激光读头作为精密测量与定位的关键设备&#xff0c;其高精度、非接触式测量特性在自动…

力扣862.和至少为K的最短子数组

力扣862.和至少为K的最短子数组 双端单调队列 前缀和 用单调队列存遍历过的前缀和&#xff0c;同时两个优化 1. 2. class Solution {public:int shortestSubarray(vector<int>& nums, int k) {int n nums.size(),ans n 1;long s[n1];s[0] 0L;for(int i0;i…

1999-2023年上市公司年报文本数据(PDF+TXT)

1999-2023年上市公司年报文本数据&#xff08;PDFTXT&#xff09; 1、时间&#xff1a;1999-2023年 2、来源&#xff1a;上市公司年度报告 3、范围&#xff1a;A股上市公司&#xff0c;5600企业&#xff0c;6.3W份 4、格式&#xff1a;PDFTXT 5、下载链接&#xff1a; 199…

东方通Web服务器(TongWeb)控制台部署改自动部署操作

首先将控制台部署改自动部署的应用进行解除部署&#xff0c;具体如下&#xff1a;登录TongWeb管理控制台&#xff0c;在左侧导航栏中点击“应用管理”&#xff0c;通过应用列表中第一列复选框选中要解除部署的应用&#xff0c;点击“解部署”&#xff0c;完成应用解除部署操作。…

4.Copy Constructor的构造操作

目录 1、对象赋值问题引入 2、Bitwise Copy Semantics&#xff08;位逐次拷贝&#xff09; 3、处理class virtual function 4、处理virtual base class subobject 1、对象赋值问题引入 在C中&#xff0c;有三种情况会以一个object的内容作为另一个class object的初值。这三…