C++模拟实现priority_queue(仿函数)

news2024/11/18 21:51:13

目录

  • 优先级队列
  • 仿函数

优先级队列

优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)
学习优先级队列时最主要的是仿函数的使用,如下less和greater

#include <vector>
namespace QBL
{
	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;
		}
	};
	//仿函数默认传小于,则是大堆
	//less这点库里面也是和人的直觉是反着的,明明是less,却是大堆
	template<class T, class Container = vector<T>, class Compare = less<T>>
	class priority_queue
	{
	public:
		void adjust_up(size_t child)
		{
			int parent = (child - 1) / 2;
			while (child > 0)
			{
				//if (_con[child] > _con[parent])
				//if (_con[parent] < _con[child])
				if(Compare()(_con[parent], _con[child]))
				{
					swap(_con[child], _con[parent]);
					child = parent;
					parent = (child - 1) / 2;
				}
				else
				{
					break;
				}
			}
		}
		void adjust_down(size_t parent)
		{
			size_t child = parent * 2 + 1;
			while (child < _con.size())
			{
				if (child + 1 < _con.size() && Compare()(_con[child], _con[child + 1]))
					++child;
				//if (_con[child] > _con[parent])
				if(Compare()(_con[parent], _con[child]))
				{
					swap(_con[child], _con[parent]);
					parent = child;
					child = parent * 2 + 1;
				}
				else
				{
					break;
				}
			}
		}
		void push(const T& val)
		{
			_con.push_back(val);
			adjust_up(_con.size() - 1);
		}
		void pop()//删除堆顶
		{
			swap(_con[0], _con[_con.size() - 1]);
			_con.pop_back();
			adjust_down(0);
		}
		const T& top()
		{
			return _con[0];
		}
		bool empty()
		{
			return _con.empty();
		}
		size_t size()
		{
			return _con.size();
		}
	private:
		Container _con;
	};
}

仿函数

仿函数本质就是一个类,其中重载了operator(),我们可以根据我们的需要改变比较逻辑。
关于仿函数的使用,不仅仅局限于上面代码的比较,还可以进行类的比较,不如日期类或者日期类的指针。如果比较日期类的指针就如下:

class ComparePDate
{
public:
	bool operator()(const Date* x, const Date* y)
	{
		return *x < *y;
	}
};

通过上述代码,即使优先级队列插入的是日期类的指针,同样可以按照我们需要的大小输出。

不仅仅是日期类,还有库中的sort函数,传参也可以传仿函数类型在这里插入图片描述
看手册的描述可以发现,我们需要传我们需要的比较逻辑,sort会根据bool类型的返回确定仿函数的两个参数哪一个排在前面。
用法如下:

struct goods
{ 
	string _name;//名字
	double _price;//价格
	int _evaluate;//评价
	goods(const char* str, double price, int evaluate)
		:_name(str)
		, _price(price)
		, _evaluate(evaluate)
	{}
};
struct ComparePriceLess
{
	bool operator()(const goods& gl, const goods& gr)
	{
		return gl._price < gr._price;
	}
};
struct ComparePriceGreater
{
	bool operator()(const goods& gl, const goods& gr)
	{
		return gl._price > gr._price;
	}
};
struct CompareEvaluateLess
{
	bool operator()(const goods& gl, const goods& gr)
	{
		return gl._evaluate < gr._evaluate;
	}
};
struct CompareEvaluateGreater
{
	bool operator()(const goods& gl, const goods& gr)
	{
		return gl._evaluate > gr._evaluate;
	}
};
int main()
{
	vector<goods> gs = { {"苹果",3.1,5},{"香蕉",2.1,4} ,{"菠萝",1.1,3} ,{"葡萄",4.1,2} };
	sort(gs.begin(), gs.end(), ComparePriceLess());//将仿函数的匿名对象做参数传入,就是我们的比较方式
	sort(gs.begin(), gs.end(), ComparePriceGreater());
	sort(gs.begin(), gs.end(), CompareEvaluateLess());
	sort(gs.begin(), gs.end(), CompareEvaluateGreater());
	return 0;
}

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

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

相关文章

Qt 学习第十天:标准对话框 页面布局

系统标准对话框 错误对话框 //错误对话框connect(createPro, &QAction::triggered, this, []{//参数1 父亲 参数2 标题 参数3 对话框内显示文本内容 。。。QMessageBox::critical(this, "报错!", "没加头文件!");}); 【运行结果】 信息对话框 co…

虚拟背景扣像SDK解决方案,电影级抠像技术

美摄科技&#xff0c;作为影像技术领域的领航者&#xff0c;凭借其革命性的虚拟背景抠像SDK解决方案&#xff0c;正以前所未有的方式&#xff0c;重新定义电影级背景抠像技术&#xff0c;让直播与视频制作迈入全新境界。 电影级抠像技术&#xff0c;重塑视觉盛宴 美摄科技的虚…

【运维】自动化运维工具,使用 Ansible 进行开发环境配置管理(本地/远程,brew/scoop/yum,docker/packer/openstack)

【运维】自动化运维工具&#xff0c;使用 Ansible 进行开发环境配置管理&#xff08;本地/远程&#xff0c;brew/scoop/yum&#xff0c;docker/packer/openstack&#xff09; 文章目录 1、什么是 Ansible&#xff0c;如何安装2、使用 ansible 自动配置本地开发环境&#xff08;…

水滴式多功能粉碎机:粉碎中草药的好帮手

水滴式中草药粉碎机&#xff0c;顾名思义&#xff0c;其设计灵感源自自然界中水滴的柔和与力量。它摒弃了传统粉碎机粗犷的粉碎方式&#xff0c;采用低速研磨技术&#xff0c;模拟水滴穿透岩石的细腻与持久&#xff0c;对中草药进行温和而深入的粉碎。这种技术不仅保留了药材中…

编写注册接口与登录认证

编写注册接口 在UserController添加方法 PostMapping("/login")public Result login(Pattern(regexp "^\\S{5,16}$") String username,Pattern(regexp "^\\S{5,16}$") String password){ // 根据用户名查询用户User loginUser userS…

锁表导致系统挂了,谨慎DDL操作

作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、 高斯及Greenplum备份恢复&#xff0c; 安装迁移&#xff0c;性能优化、故障…

从关键新闻和最新技术看AI行业发展(第三十一期2024.8.26-9.8) |【WeThinkIn老实人报】

写在前面 【WeThinkIn老实人报】旨在挖掘AI行业的关键新闻和最新技术&#xff0c;同时Rocky会对其中的关键信息进行解读&#xff0c;力求让读者们能从容掌握AI科技潮流。 欢迎大家关注Rocky的公众号&#xff1a;WeThinkIn 欢迎大家关注Rocky的知乎&#xff1a;Rocky Ding AIGC算…

串口接收不到数据之电阻虚焊bug分析思路

单片机和EC移远通信模块进行通信&#xff0c;相同的代码运行在相同的硬件上&#xff0c;但是一个能联网&#xff0c;一个因为没有EC的应答连不上网。 开始分析&#xff0c;排除软件问题&#xff0c;给EC模块发为什么没应答&#xff1f; 1.发送失败 2.接收失败 排除情况2&#x…

GDPU Vue前端框架开发 计数器

计数器算不到你双向绑定的进度。 重要的更新公告 &#xff01;&#xff01;&#xff01;GDPU的小伙伴&#xff0c;感谢大家的支持&#xff0c;希望到此一游的帅哥美女能有所帮助。本学期的前端框架及移动应用&#xff0c;采用专栏订阅量达到50才开始周更了哦( •̀ .̫ •́ )✧…

BMP图片与VGA(HDMI)时序互转

1.BMP介绍 BMP&#xff08;Bitmap&#xff09;是一种用于存储位图图像的文件格式&#xff0c;广泛应用于 Windows 操作系统中。BMP 文件可以存储高质量的图像数据&#xff0c;包括颜色深度较高的图片&#xff0c;同时支持无压缩或可选的简单压缩方式。 BMP格式&#xff1a; …

低代码-赋能新能源汽车产业加速前行

在“双碳”战略目标的引领下&#xff0c;全球新能源汽车产业正经历着前所未有的发展和变革&#xff0c;新能源汽车整车制造成为绿色低碳转型的重要领域。在政府的大力扶持下&#xff0c;新能源整车制造领域蓬勃发展&#xff0c;已成为全球汽车产业不可逆转的重要趋势。新能源汽…

上传文件到钉盘流程详解

文章目录 前言准备工作实现过程Maven依赖封装一个工具类获取文件上传信息unionId获取钉盘目录spaceId创建上传到钉盘前言 本文详解如何通过钉钉的API实现上传文件到钉盘目录,代码通过JAVA实现。 准备工作 1、在钉钉开发者后台创建一个钉钉企业内部应用; 2、创建并保存好应…

五星级可视化页面(23):污水处理、防汛可视化大屏

本期是第23期&#xff0c;分享一下水处理相关的大屏&#xff0c;欢迎老铁们勇于讨论&#xff0c;品鉴。

10款高效电脑监控软件推荐,电脑屏幕监控软件

在现代工作环境中&#xff0c;企业越来越依赖电脑监控软件来确保员工的工作效率、数据安全以及合规性。这些软件可以帮助管理者监督员工的日常活动&#xff0c;防止数据泄露&#xff0c;并确保工作时间得以合理使用。以下&#xff0c;我们将为您推荐10款高效的电脑监控软件&…

以太网传输出现不分包

最近对手件反馈,在传输文件的时候,我们这边发包太快,导致对手件网络出现了拥塞,把他们程序给搞死了。他们抓了一下他们收到的包,发现我们发送的数据包都大于了MTU设置的值。现在被要求更改。 排查方法:为什么我们发送的数据包会大于MTU的值。 可能性一:配置了Dont Fra…

Cryptography and Network Security: Principles and Practice(Lesson 2 notes)

Playfair Cipher Operation steps Construct a 55 letter matrix based onThe matrix is ​​constructed using a keyword (key)Then from left to right, from top to bottom; fill in the letters of the key in sequence (note: repeated letters in the key are not fil…

Open-Sora代码详细解读(2):时空3D VAE

Diffusion Models视频生成 前言&#xff1a;目前开源的DiT视频生成模型不是很多&#xff0c;Open-Sora是开发者生态最好的一个&#xff0c;涵盖了DiT、时空DiT、3D VAE、Rectified Flow、因果卷积等Diffusion视频生成的经典知识点。本篇博客从Open-Sora的代码出发&#xff0c;深…

齐活儿了:一文读懂ERP和MRP、MES、CRM、WMS、SRM、APS等系统

ERP&#xff0c;即企业资源计划系统&#xff0c;是驱动企业资源整合与高效管理的核心引擎。它覆盖了企业财务、人力资源、研发创新、生产制造、供应链管理、采购活动、销售市场、客户服务以及资产管理这九大核心业务领域&#xff0c;形成了一个全方位、多层次的企业价值链管理体…

a-table 定时平滑轮播组件

效果图&#xff1a; 实现代码如下&#xff1a; <template><div class"scroll-container" mouseenter"stopScroll" mouseleave"startScroll"><a-table:columns"columns":data-source"visibleData":paginatio…

【BFS专项】— 解决最短路问题

1、迷宫中离入口最近的出口 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 利用BFS层序遍历&#xff0c;新建一个变量统计步数代码&#xff1a; class Solution {int dx[] {0, 0, -1, 1};int dy[] {1, -1, 0, 0};public int nearestExit(char[][] maze, int[] en…