STL之priority_queue与仿函数

news2024/10/6 22:20:06

目录

    • 一.仿函数
      • 1.介绍
      • 2.示例
    • 二.priority_queue
      • 1.介绍
      • 2.成员函数
      • 3.模拟实现
      • 4.使用
    • 三.其他
      • 1.typename Container::value_type

一.仿函数

1.介绍

函数对象,又称仿函数,是可以像函数一样使用的对象,其原理就是重载了函数调用符:()

因此在此类中,一定有operator()的成员函数。

2.示例

template<class T>
struct _less
{
    //lhs:left-hand side
	bool operator() (const T& lhs, const T& rhs)
	{
		return lhs < rhs;
	}
};

如果T是内置类型,则直接进行比较。如果T是自定义类型,则会调用其operator<()。
在这里插入图片描述

先创建一个_less类型的对象smaller,对于smaller(),则调用其operator()函数

二.priority_queue

1.介绍

在这里插入图片描述

priority_queue,也是一种容器适配器:class Container = vector<T>,底层默认为vector

同时,对于其元素存储,类似于大/小 堆(父节点大于(小于)子节点的值),根据某种排序标准,使它的第一个元素总是其所有元素中最大/小的。

是按大还是小来存储,通过第3个模板参数来规定

class Compare= less<T>,缺省为less,即第一个元素总是最大的(其他插入的元素都比第一个less)。

2.成员函数

在这里插入图片描述

3.模拟实现

可以根据大小堆的算法,进行模拟实现
数据结构——堆

#include <vector>
#include <functional>
namespace yyjs
{
	template<class T, class Container = std::vector<T>,class Compare = std::less<T>>
	class priority_queue
	{
	public:
		bool empty() const
		{
			return _con.empty();
		}
		size_t size() const
		{
			return _con.size();
		}
		const T& top() const
		{
			return _con.front();
		}
		T& top() 
		{
			return _con.front();
		}
        
		//从child位置开始向上调整,直到符合Compare的规则
		void AdjustUp(size_t child)
		{
            //根据二叉树,求出父节点的位置
			size_t parent = (child - 1) / 2;
            
            //如果当前当前节点不是根节点,且其父节点与当前节点进行比较,符合规则
			while (child > 0 && _cmp(_con[parent], _con[child]))
			{
                //交换当前节点与其父节点的值
                std::swap(_con[parent], _con[child]);
                child = parent;
                parent = (child - 1) / 2;	
			}
		}
    	//尾插入一个节点,并将这个节点按规则进行调整
		void push(const T& x)
		{
			_con.push_back(x);
			AdjustUp(size() - 1);
		}
        //从parent位置开始向下进行调整,使其符合Compare规则
		void AdjustDown(size_t parent)
		{
			size_t child = parent * 2 + 1;//左孩子
			//当其子节点在有效范围内
            while (child < size())
			{	
                //如果有右节点其右节点更大(小),选择右节点
				if (child + 1 < size() && _cmp(_con[child],_con[child + 1]))
				{
					child++;
				}
                //当前节点与其子节点进行比较,符合规则,进行交互
				if (_cmp(_con[parent], _con[child]))
				{
					::swap(_con[parent],_con[child]);
					parent = child;
					child = parent * 2 + 1;
				}
				else
				{
					break;
				}
			}
		}
        //删除第一个元素,然后将剩余元素按规则调整
		void pop()
		{
            //先交换首尾元素,然后再删尾元素
			std::swap(_con.back(), _con.front());
			_con.pop_back();
            //把交换上去的首元素向下调整,使符合规则
			AdjustDown(0);
		}

	private:
		Container _con;
		Compare _cmp;
	};
}

4.使用

在这里插入图片描述

三.其他

1.typename Container::value_type

在这里插入图片描述

在less的显示实例化时,所传入的typename Container::value_type类型,所代表的是:Container类中定义的value_type类型

因为class Container = vector<T>,以vector示例:
在这里插入图片描述

using:相当于typedef

由此可见typename Container::value_type其实就相当于T类型,只是库中的更加规范


🦀🦀观看~~

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

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

相关文章

浅谈数据中台之标签管理平台

在现如今的大数据时代&#xff0c;相信大家一定了解或者听说过下列几个场景&#xff1a; 购物APP&#xff1a;千人千面&#xff0c;意思不同用户使用相关的产品感觉是不一样的&#xff0c;不同用户看到的购物APP首页推荐内容和其他相关推荐流信息可能是完全不同的。 社交APP&…

实例:使用网络分析仪进行电缆测试

本应用测试针对非标称50Ω的线缆&#xff0c;包括同轴、双绞线、差分高速数据线的测试&#xff0c;包括阻抗参数、S参数&#xff08;插损、驻波、Smith图等等&#xff09;&#xff0c;也可以绘制眼图。 根据电缆的性能&#xff0c;如频率范围、长度、是否差分&#xff0c;设置…

Linux:root用户

root用户对Linux系统拥有最大的操作权限。 普通用户的权限一般都在home目录下&#xff0c;超过home目录后&#xff0c;普通用户在很多地方只有只读和执行的权限&#xff0c;但没有修改权限。 1、su命令&#xff1a;切换到root用户的命令语法&#xff1a; su -root “-”符号是可…

精密空调监控:不会这个技巧,千万不要尝试

随着科技的不断进步和信息化的发展&#xff0c;精密空调设备被广泛应用于数据中心、通信基站、医疗设施、实验室等对温度和湿度要求严格的环境中&#xff0c;以保证设备的正常运行和数据的安全性。 借助动环监控系统&#xff0c;精密空调可以实时了解设备的运行状态、温湿度的变…

数据库迁移 | Oracle数据迁移方案之技术两三点

今年Oracle似乎又火了&#xff0c;火得要下掉&#xff0c;目前中国大概有240数据库企业&#xff0c;在国产信创的大趋势下&#xff0c;一片欣欣向荣&#xff0c;国库之春已然来临。到今天为止&#xff0c;Oracle依旧是市场份额最大的数据库&#xff0c;天下苦秦久矣&#xff0c…

关于使用keil瑞萨RA4M2踩过的坑

一、之前在rasc添加的组件不能删除。 下面在rasc添加ThreadX&#xff0c;不只是RTOS&#xff0c;其他组件也出现这种情况。 当去掉组件不使用&#xff0c;重新配置。但是组件还是显示在软件包&#xff0c;导致编译出错。 解决方式&#xff0c;自己琢磨发现&#xff1a; 找到工…

腾讯视频技术团队偷懒了?!

&#x1f449;腾小云导读 PC Web 端、手机 H5 端、小程序端、App 安卓端、App iOS 端......在多端时代&#xff0c;一个应用往往需要支持多端。若每个端都独立开发一套系统来支持&#xff0c;将消耗巨大的人力和经费&#xff01;腾讯视频团队想到一个“偷懒”的方法——能不能只…

共建智慧工厂物联网平台方案 | 6.10 IoTDB X EMQ 主题 Meetup 回顾

6 月 10 日&#xff0c;IoTDB X EMQ 智慧工厂主题 Meetup 在深圳成功举办。工业物联网时序数据库研发商天谋科技、物联网数据基础设施软件供应商 EMQ 的两位技术大牛&#xff0c;针对多行业制造流程中数据传输、故障感知、决策执行等常见难题&#xff0c;通过数据基础设施平台的…

更智能、更强大:OpenAI发布升级版gpt-3.5-turbo-0613/16k速度提升,长度飙升4倍

OpenAI开发者平台最近推出了两个引人注目的GPT升级版本&#xff1a;gpt-3.5-turbo-0613和gpt-3.5-turbo-16k。这些新版本带来了一系列令人兴奋的功能和增强&#xff0c;为开发者提供了更加灵活和强大的自然语言处理工具。本文将为您介绍这两个版本的主要特点和优势。 gpt-3.5-t…

vue使用外部字体自定义LCD字体(晶管体)

大屏监控中常用到液晶字体效果&#xff0c;如下图所示&#xff1a; 一、下载字体格式 1、下载地址【Techno > LCD fonts | dafont.com】 二、解压字体 1、下载后&#xff0c;解压后都是.ttf文件&#xff0c;在Font Squirrel &#xff08;这个地址打开&#xff0c;直接可以…

Multi-headed Self-attention(多头自注意力)机制介绍

对于输入的序列 来说&#xff0c;与RNN/LSTM的处理过程不同&#xff0c;Self-attention机制能够并行对进行计算&#xff0c;这大大提高了对特征进行提取&#xff08;即获得&#xff09;的速度。结合上述Self-attention的计算过程&#xff0c;并行计算的原理如下图所示&#xff…

储存卡格式化,分享3个正确方法!

Dam是个摄影师&#xff0c;经常使用储存卡存储各种照片、视频。正好他明天又要出外景&#xff0c;但害怕内存不够&#xff0c;想把储存卡格式化&#xff0c;又担心自己操作失误。因此求助如何正确格式化储存卡。 储存卡为我们存储文件等带来了诸多便利。有时候&#xff0c;我们…

无人机上仅使用CPU实时运行Yolov5(OpenVINO实现)(下篇)

​上期中我们讲了Yolov5的前两节环境配置及简单运行&#xff0c;在本期中我们带来后面两节在不同处理器下的实验数据及如何训练自己的模型。​ 三、在不同处理器上的延迟与效果 为了查看Yolov5在不同设备上的延迟与效果&#xff0c;下面我们对Inter的i3、i5、i7三种处理器在同…

「深度学习之优化算法」笔记(三)之粒子群算法

1. 粒子群算法简介 粒子群算法&#xff08;Particle Swarm Optimization,PSO&#xff09;是一种模仿鸟群、鱼群觅食行为发展起来的一种进化算法。其概念简单易于编程实现且运行效率高、参数相对较少&#xff0c;应用非常广泛。粒子群算法于1995年提出&#xff0c;距今&#xff…

新世界-旧世界

以下内容是这两天朋友问答形成的一些观点&#xff0c;堆成一篇文章。看似没有关联性&#xff0c;但你仔细品味&#xff0c;你会感觉到它们其实讲的是一个事。至于是一个啥事&#xff0c;我不说&#xff0c;你们自己猜。 &#xff08;1&#xff09; 今年年初看见篇文章&#xff…

前端vue仿京东天猫简单好用的瀑布流瀑布流式布局列表组件waterfall

前端vue仿京东天猫简单好用的瀑布流瀑布流式布局列表组件waterfall&#xff0c; 下载完整代码请访问uni-app插件市场址:https://ext.dcloud.net.cn/plugin?id13046 效果图如下&#xff1a; #### 使用方法 使用方法 <!-- proList: 条目数组数据 goProDetail:条目点击事…

vue路由的两种模式 hash与history

文章目录 vue路由是什么&#xff1f;Hash 模式Hash具体的原理如下&#xff1a;Hash 模式的好处缺点 History 模式实现 History 模式的原理如下&#xff1a;History 模式的好处缺点 vue路由是什么&#xff1f; Vue 路由是 Vue.js 框架提供的一种机制&#xff0c;用于实现单页面…

驱动开发:内核解锁与强删文件

在某些时候我们的系统中会出现一些无法被正常删除的文件&#xff0c;如果想要强制删除则需要在驱动层面对其进行解锁后才可删掉&#xff0c;而所谓的解锁其实就是释放掉文件描述符&#xff08;句柄表&#xff09;占用&#xff0c;文件解锁的核心原理是通过调用ObSetHandleAttri…

【科学文献计量】关于使用metaknowledge读取文献后转化字典结构报错PD问题的解决方式

关于使用metaknowledge读取文献后转化字典结构报错PD问题的解决方式 1 问题说明2 问题探索3 问题解决4 数据核实1 问题说明 在进行文献下载完毕后,使用metaknowledge读入文献时候是正常的,但是要通过RC.makeDict()方法转化为字典结构,却发生了PD报错问题(KeyError: PD),如…

基于SpringBoot+vue的在线考试系统设计和实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…