C++初识仿函数

news2025/1/11 10:12:09

C++初识仿函数

在这里插入图片描述

📟作者主页:慢热的陕西人

🌴专栏链接:C++

📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言

本博客主要内容简单介绍了仿函数的概念

文章目录

  • C++初识仿函数
    • 1.仿函数的介绍
    • 2.仿函数的优缺点
    • 3.简单实现一个仿函数的例子

1.仿函数的介绍

我们可以从名字中看出仿函数就是一个仿造的函数,实际上也是如此,它并非一个真正的函数。而是通过一个类重载()运算符实现的。

接下来给出定义:

  • 仿函数是定义了一个含有**operator()**成员函数的对象,可以视为一个一般的函数,只不过这个函数功能是在一个类中的运算符operator()中实现,是一个函数对象,它将函数作为参数传递的方式来使用。

2.仿函数的优缺点

优点:

  • 仿函数比函数指针的执行速度快,函数指针时通过地址调用,而仿函数是对运算符operator进行自定义来提高调用的效率。
  • 仿函数比一般函数灵活,可以同时拥有两个不同的状态实体(即采用匿名对象和非匿名对象来调用),一般函数不具备此种功能
  • 仿函数可以作为模板参数使用,因为每个仿函数都拥有自己的类型

缺点:

  • 需要单独实现一个类。
  • 定义形式比较复杂。

3.简单实现一个仿函数的例子

通俗来讲,仿函数就是使用一个类通过重载()这个运算符实现的。

template<class T>
    //实现
	struct less
	{
		bool operator()(T& a, T& b)
		{
			return a < b;
		}
	};

	template<class T>
	struct greater
	{
		bool operator()(T& a, T& b)
		{
			return a > b;
		}
	};
//采用匿名对象的方式调用
void AdjustUp(int child)
		{
			int parent = (child - 1) >> 1;
			while (child)
			{
				//小堆
				//if (_con[child] < _con[parent])
				if(Compare()(_con[child], _con[parent]))
				{
					swap(_con[parent], _con[child]);
					child = parent;
				}
				else
				{
					return;
				}
			}
		}

		void AdjustDown(int parent)
		{
			//小堆
			int child = parent * 2 + 1;
			while (child < _con.size())
			{
				//找到两个孩子节点之中较小的那个
				//if (child + 1 < _con.size() && _con[child] > _con[child + 1])
				if (child + 1 < _con.size() && Compare()(_con[child], _con[child + 1]))
				{
					child += 1;
				}
				//if (_con[parent] > _con[child])
				if(Compare()(_con[parent], _con[child]))
				{
					swap(_con[parent], _con[child]);
					parent = child;
					child = parent * 2 + 1;
				}
				else
				{
					return;
				}
			}
		}
//采用实例化对象的方式调用
		void AdjustUp(int child)
		{
			Compare _com;
			int parent = (child - 1) >> 1;
			while (child)
			{
				//小堆
				//if (_con[child] < _con[parent])
				if(_com(_con[child], _con[parent]))
				{
					swap(_con[parent], _con[child]);
					child = parent;
				}
				else
				{
					return;
				}
			}
		}

		void AdjustDown(int parent)
		{
			Compare _com;
			//小堆
			int child = parent * 2 + 1;
			while (child < _con.size())
			{
				//找到两个孩子节点之中较小的那个
				//if (child + 1 < _con.size() && _con[child] > _con[child + 1])
				if (child + 1 < _con.size() && _com(_con[child], _con[child + 1]))
				{
					child += 1;
				}
				//if (_con[parent] > _con[child])
				if(_com(_con[parent], _con[child]))
				{
					swap(_con[parent], _con[child]);
					parent = child;
					child = parent * 2 + 1;
				}
				else
				{
					return;
				}
			}
		}

到这本篇博客的内容就到此结束了。
如果觉得本篇博客内容对你有所帮助的话,可以点赞,收藏,顺便关注一下!
如果文章内容有错误,欢迎在评论区指正

在这里插入图片描述

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

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

相关文章

计算机组成原理-中央处理器-CPU指令和数据执行过程

目录 一、CPU的功能和基本架构 二、指令cpu执行过程 指令周期​编辑 各周期执行过程 指令执行方案 三、数据通路 3.1 cpu内部单总线 3.1.1 寄存器之间传送 3.1.2 主存与cpu之间数据传送 3.1.3 执行算术或逻辑运算的 3.2 cpu内部多总线 3.3 专用数据通路 一、CPU的功能和…

javascript基础九:说说Javascript中的继承?如何实现继承?

一、是什么 继承&#xff08;inheritance&#xff09;是面向对象软件技术当中的一个概念 如果一个类别B“继承自”另一个类别A&#xff0c;就把这个B称为“A的子类”&#xff0c;而把A称为“B的父类别”也可以称“A是B的超类” 继承的优点 继承可以使得子类具有父类别的各种属性…

[LeetCode周赛复盘] 第 105 场双周赛20230528

[LeetCode周赛复盘] 第 105 场双周赛20230528 一、本周周赛总结6395. 购买两块巧克力1. 题目描述2. 思路分析3. 代码实现 6394. 字符串中的额外字符1. 题目描述2. 思路分析3. 代码实现 6393. 一个小组的最大实力值1. 题目描述2. 思路分析3. 代码实现 6464. 最大公约数遍历1. 题…

性能测试需求分析有哪些?怎么做?

目录 性能测试必要性评估 常见性能测试关键评估项如下&#xff1a; 性能测试工具选型 性能测试需求分析 性能测试需求评审 性能测试需求分析与传统的功能测试需求有所不同&#xff0c;功能测试需求分析重点在于从用户层面分析被测对象的功能性、易用性等质量特性&#xff…

【Go语言从入门到实战】并发篇

Go语言从入门到实战 — 并发篇 协程 Thread vs Groutine 相比之下&#xff0c;协程的栈大小就小很多了&#xff0c;创建起来也会更快&#xff0c;也更节省系统资源。 一个 goroutine 的栈&#xff0c;和操作系统线程一样&#xff0c;会保存其活跃或挂起的函数调用的本地变量…

2023 年面向初学者的 5 大自由写作技巧

在这篇文章中&#xff0c;我们将讨论初学者的自由写作技巧 译自&#xff1a;https://jitendra.co/freelance-writing-tips-for-beginners/ 比较平易近人&#xff0c;在做独立站并且自己写原创时候可以参考下&#xff0c;面对的甲方爸爸不同而已 最初的兼职活动最终成为我生活中…

Docker下安装MySQL,PostgreSQL,SQL Server(包含离线和在线安装)

1 MySQL 1.1 离线安装 1.1.1 加载镜像 使用ftp工具将安装包上传至服务器最大目录下&#xff0c;这里以根目录为最大目录举例 键入加载镜像命令&#xff1a;docker load -i 镜像包名称 docker load -i mysql80.tar使用docker images命令查看已经加载的镜像&#xff0c;如上…

【利用ChatGPT学习英语口语(包括如何安装插件的详细教程)】

内容目录 一、插入ChatGPT语音播放插件1. 打开谷歌浏览器——右上角三点——更多工具——扩展程序2. 点击扩展程序三个横杠——打开chrome 应用商店3. 搜索Voice Control for ChatGPT——点击如下图第一个——添加至Chrome——添加扩展程序4. 成功安装&#xff0c;打开ChatGPT有…

【大数据hive】hive视图与物化视图使用详解

目录 一、hive中的视图 二、hive视图语法与操作 2.1 数据准备 2.2 创建视图 2.2.1 创建普通的视图 2.2.2 基于视图创建视图 2.3 查看视图定义 2.4 使用视图 2.5 删除视图 2.6 更改视图属性 2.7 更改视图定义 三、使用视图的好处 3.1 只将真实表中特定的列数据提…

线程同步模式的设计思路

&#x1f473;我亲爱的各位大佬们好&#x1f618;&#x1f618;&#x1f618; ♨️本篇文章记录的为 JDK8 新特性 Stream API 进阶 相关内容&#xff0c;适合在学Java的小白,帮助新手快速上手,也适合复习中&#xff0c;面试中的大佬&#x1f649;&#x1f649;&#x1f649;。 …

ISCC2023 擂台misc wp

刚想起来发 文章目录 雪豹哦&#xff1f;摩斯密码&#xff1f;ඞG9的钢琴曲BNG听你心跳里的狂Brain Games user-id&#xff1a;芝士雪豹 雪豹 这道题没啥意思&#xff0c;存粹为了套拿450分。知识点属于重复知识点&#xff0c;见谅&#xff1a; 拿到附件&#xff0c;用360解…

分布式网络通信框架(十)——Mprpc框架使用示例

发布一个服务提供远程调用方法的流程 若想要发布一个服务提供一些远程调用方法&#xff0c;步骤如下&#xff1a; 先在protobuf文件中添加参数和返回值的message 类型&#xff0c;然后再添加希望提供的服务 service 类型&#xff08;如UserServiceRpc&#xff09;和 其中的方…

傅里叶级数和傅里叶变换之间的关系推理及应用

傅里叶级数和傅立叶变换是傅里叶分析的两个主要工具&#xff0c;它们之间有密切的关系。 什么是傅里叶级数 傅里叶级数是将一个周期函数分解为一系列正弦和余弦函数的和。它适用于周期性信号&#xff0c;可以将周期函数表示为一组振幅和相位不同的谐波分量的和。傅里叶级数展…

【ChatGPT】ChatGPT快速生成短视频

1.chatGPT剪映 chatGPT生成文本后通过剪映图文成片 这次用了new bing&#xff1a;Chatbot AI 在线网页版 (atmob.cn) 打开剪映-图文成片 把new bing生成的文本粘贴过来&#xff0c;点击生成视频。 生成好了&#xff0c;是这样 剪映自动生成的&#xff0c;最后还是得手工改改&…

ChatGPT生成Excel统计公式

&#x1f34f;&#x1f350;&#x1f34a;&#x1f351;&#x1f352;&#x1f353;&#x1fad0;&#x1f951;&#x1f34b;&#x1f349; ChatGPT生成Excel统计公式 文章目录 &#x1f350;问题引入&#x1f350;具体操作&#x1f433;结语 &#x1f350;问题引入…

如何使用 service account 获取 keycloak 的用户信息

Keycloak 是一个开源的权限管理和认证系统。使用 Keycloak 可以让开发者专注于解决业务的核心问题。获取用户信息是权限管理和认证系统需要的基本功能。Service Account 是OAuth 2.0推荐的系统服务使用的账户&#xff0c;开发者可以通过 Keycloak 的 Service Account 来让自己的…

【嵌入式烧录/刷写文件】-3.2-S19/Hex文件转换为Bin文件

案例背景(共6页精讲)&#xff1a; 该篇将告诉您&#xff1a;如何使用Vector HexView工具&#xff0c;对一个Intel Hex或Motorola S-record(S19/SREC/mot/SX)文件转换为bin文件。 目录 1 Intel Hex&#xff0c;Motorola S-record(S19/SREC/mot/SX)&#xff0c;Bin文件之间的差…

基于SpringBoot养老院管理系统

目录 一、项目介绍 二. 运行环境 三、项目技术 四、部署项目 五、项目运行 六、项目展示 五、项目下载 一、项目介绍 基于springboot的养老院管理系统拥有多种角色账号&#xff1a;管理员和用户 管理员&#xff1a;管理员管理、用户管理、健康管理、病例方案管理、药品…

计算机网络面试八股文

网络分层结构 计算机网络体系大致分为三种&#xff0c;OSI七层模型、TCP/IP四层模型和五层模型。一般面试的时候考察比较多的是五层模型。最全面的Java面试网站&#xff1a;最全面的Java面试网站 五层模型&#xff1a;应用层、传输层、网络层、数据链路层、物理层。 应用层&a…

文生视频综述

文字生成视频当前挑战 和发展现状_哔哩哔哩_bilibili今天我们聊了什么是 text to video&#xff0c;它的原理和目前的研究进展。text to video 是一种将文本转换为视频的技术&#xff0c;它可以通过图像处理、语音识别和自然语言处理等技术来实现。目前&#xff0c;text to vid…