C++仿函数

在C++中,我们经常需要对类中的元素进行比较,例如在排序、查找等操作中。为了使类更加灵活,我们可以通过自定义比较函数来实现不同的比较方式。在本文中,我们将探讨如何在类中使用仿函数和 Lambda 表达式来定义自定义比较函数。

1. 仿函数(Functor)的使用

仿函数是一个类对象,它的实例可以像函数一样被调用。我们可以通过重载函数调用运算符 operator() 来实现仿函数。以下是一个简单的示例,演示了如何在类中使用仿函数来实现自定义比较:

解释

#include <iostream>// 定义一个比较类
class MyComparator {
public:// 重载函数调用运算符bool operator()(const int& a, const int& b) const {return a > b; // 自定义比较规则}
};// 使用比较类的类模板
template <typename T, typename Compare = MyComparator>
class MyClass {
public:// 成员变量T data;// 构造函数,接受比较类作为参数MyClass(const T& d, const Compare& cmp = Compare()) : data(d), comparator(cmp) {}// 比较函数bool compare(const T& other) const {return comparator(data, other);}private:Compare comparator; // 保存比较类的实例
};int main() {// 创建类实例,使用默认比较规则MyClass<int> myObj(5);// 使用比较函数std::cout << myObj.compare(3) << std::endl;  // 输出 1(true)// 创建类实例,使用自定义比较规则MyClass<int, MyComparator> customObj(5);// 使用比较函数std::cout << customObj.compare(8) << std::endl;  // 输出 0(false)return 0;
}

2. Lambda 表达式的使用

Lambda 表达式是C++11引入的一种方便的匿名函数表示方法。它允许我们在需要函数的地方内联定义函数,包括自定义比较函数。以下是如何在类中使用 Lambda 表达式的示例:

解释

#include <iostream>
#include <functional>// 使用 Lambda 表达式的类模板
template <typename T>
class MyClassWithLambda {
public:// 成员变量T data;// 构造函数,接受 Lambda 表达式作为参数MyClassWithLambda(const T& d, const std::function<bool(const T&, const T&)>& cmp) : data(d), comparator(cmp) {}// 比较函数bool compare(const T& other) const {return comparator(data, other);}private:std::function<bool(const T&, const T&)> comparator; // 保存 Lambda 表达式
};int main() {// 创建类实例,使用 Lambda 表达式定义比较规则MyClassWithLambda<int> lambdaObj(5, [](const int& a, const int& b) {return a > b;});// 使用比较函数std::cout << lambdaObj.compare(3) << std::endl;  // 输出 1(true)return 0;
}

或者

解释

#include <iostream>// 使用比较类的类模板
template <typename T, typename Compare = std::less<T>>
class MyClass {
public:// 成员变量T data;// 构造函数,接受比较类作为参数MyClass(const T& d, const Compare& cmp = Compare()) : data(d), comparator(cmp) {}// 比较函数bool compare(const T& other) const {return comparator(data, other);}private:Compare comparator; // 保存比较类的实例
};int main() {auto MyComparator = [] (const int& x, const int& y) {return x > y;};// 创建类实例,使用自定义比较规则MyClass<int, decltype(MyComparator)> customObj(5, MyComparator);// 使用比较函数std::cout << customObj.compare(8) << std::endl;  // 输出 0(false)return 0;
}

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

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

相关文章

《C++并发编程实战》笔记(三)

三、线程间共享数据的保护 多个线程同时访问修改共享的数据时&#xff0c;如果不加以控制&#xff0c;可能会造成未知的错误&#xff0c;为了解决这个问题&#xff0c;需要采取特殊的手段保证数据在各个线程间可以被正常使用。 这里介绍使用互斥量保护数据的方法。 3.1 使用互…

基础vrrp(虚拟路由冗余协议)

一、VRRP 虚拟路由冗余协议 比如交换机上联两个路由器&#xff0c;由两个路由虚拟出一台设备设置终端设备的网关地址&#xff0c;两台物理路由的关系是主从关系&#xff0c;可以设置自动抢占。终端设备的网关是虚拟设备的ip地址&#xff0c;这样&#xff0c;如果有一台路由设备…

pytorch学习(十一)checkpoint

当训练一个大模型数据的时候&#xff0c;中途断电就可以造成已经训练几天或者几个小时的工作白做了&#xff0c;再此训练的时候需要从epoch0开始训练&#xff0c;因此中间要不断保存&#xff08;epoch&#xff0c;net&#xff0c;optimizer&#xff0c;scheduler&#xff09;等…

深入探索:Stable Diffusion 与传统方法对比:优劣分析

深入探索&#xff1a;Stable Diffusion 与传统方法对比&#xff1a;优劣分析 一、引言 随着人工智能和深度学习的发展&#xff0c;优化算法在神经网络训练中的重要性日益凸显。传统的优化方法&#xff0c;如随机梯度下降&#xff08;SGD&#xff09;、动量法和Adam等&#xf…

动手学深度学习——5.卷积神经网络

1.卷积神经网络特征 现在&#xff0c;我们将上述想法总结一下&#xff0c;从而帮助我们设计适合于计算机视觉的神经网络架构。 平移不变性&#xff08;translation invariance&#xff09;&#xff1a;不管检测对象出现在图像中的哪个位置&#xff0c;神经网络的前面几层应该对…

《昇思 25 天学习打卡营第 15 天 | 基于MindNLP+MusicGen生成自己的个性化音乐 》

《昇思 25 天学习打卡营第 15 天 | 基于MindNLPMusicGen生成自己的个性化音乐 》 活动地址&#xff1a;https://xihe.mindspore.cn/events/mindspore-training-camp 签名&#xff1a;Sam9029 MusicGen概述 MusicGen是由Meta AI的Jade Copet等人提出的一种基于单个语言模型&…

密码学原理精解【8】

文章目录 概率分布哈夫曼编码实现julia官方文档建议的变量命名规范&#xff1a;julia源码 熵一、信息熵的定义二、信息量的概念三、信息熵的计算步骤四、信息熵的性质五、应用举例 哈夫曼编码&#xff08;Huffman Coding&#xff09;基本原理编码过程特点应用具体过程1. 排序概…

Bubbliiiing 的 Retinaface rknn python推理分析

Bubbliiiing 的 Retinaface rknn python推理分析 项目说明 使用的是Bubbliiiing的深度学习教程-Pytorch 搭建自己的Retinaface人脸检测平台的模型&#xff0c;下面是项目的Bubbliiiing视频讲解地址以及源码地址和博客地址&#xff1b; 作者的项目讲解视频&#xff1a;https:…

FFmpeg音视频流媒体的顶级项目

搞音视频、流媒体的圈子,没法躲开ffmpeg这个神级项目。 FFmpeg 是一个功能强大且广泛使用的多媒体处理工具。FFmpeg 具备众多出色的特性。它支持多种音频和视频格式的转换,能轻松将一种格式的文件转换为另一种,满足不同设备和应用的需求。不仅如此,它还可以进行视频的裁剪、…

php编译安装

一、基础环境准备 # php使用www用户 useradd -s /sbin/nologin -M www二、下载php包 # 下载地址 https://www.php.net/downloads wget https://www.php.net/distributions/php-8.3.9.tar.gz三、配置编译安装 编译安装之前需要处理必要的依赖&#xff0c;在编译配置安装&…

使用多进程和多线程实现服务器并发【C语言实现】

在TCP通信过程中&#xff0c;服务器端启动之后可以同时和多个客户端建立连接&#xff0c;并进行网络通信&#xff0c;但是在一个单进程的服务器的时候&#xff0c;提供的服务器代码却不能完成这样的需求&#xff0c;先简单的看一下之前的服务器代码的处理思路&#xff0c;再来分…

Python中自定义上下文管理器的创建与应用

Python中自定义上下文管理器的创建与应用 在Python编程中,上下文管理器是一个非常重要的概念。它们允许我们更好地管理资源,如文件句柄、网络连接或数据库连接等,确保这些资源在使用后能够被正确关闭或释放,从而避免资源泄露。Python标准库中的contextlib模块提供了强大的…

代码随想录学习 day54 图论 Bellman_ford 算法精讲

Bellman_ford 算法精讲 卡码网&#xff1a;94. 城市间货物运输 I 题目描述 某国为促进城市间经济交流&#xff0c;决定对货物运输提供补贴。共有 n 个编号为 1 到 n 的城市&#xff0c;通过道路网络连接&#xff0c;网络中的道路仅允许从某个城市单向通行到另一个城市&#xf…

【HarmonyOS】网络连接 - Http 请求数据

在日常开发应用当中&#xff0c;应用内部有很多数据并不是保存在应用内部&#xff0c;而是在服务端。所以就需要向服务端发起请求&#xff0c;由服务端返回数据。这种请求方式就是 Http 请求。 一、申请网络权限 在 module.json5 文件中&#xff0c;添加网络权限&#xff1a; …

手持式气象站:便携科技,掌握微观气象的利器

手持式气象站&#xff0c;顾名思义&#xff0c;是一种可以随身携带的气象监测设备。它小巧轻便&#xff0c;通常配备有温度、湿度、风速、风向、气压等多种传感器&#xff0c;能够实时测量并显示各种气象参数。不仅如此&#xff0c;它还具有数据存储、数据传输、远程控制等多种…

Django教程(003):orm操作数据库

文章目录 1 orm连接Mysql1.1 安装第三方模块1.2 ORM1.2.1、创建数据库1.2.2、Django连接数据库1.2.3、django操作表1.2.4、创建和修改表结构1.2.5、增删改查1.2.5.1 增加数据1.2.5.2 删除数据1.2.5.3 获取数据1.2.5.4 修改数据 1 orm连接Mysql Django为了使操作数据库更加简单…

Linux shell编程学习笔记65: nice命令 显示和调整进程优先级

0 前言 我们前面学习了Linux命令ps和top&#xff0c;命令的返回信息中包括优先序&#xff08;NI&#xff0c;nice&#xff09; &#xff0c;我们可以使用nice命令来设置进程优先级。 1 nice命令 的功能、格式和选项说明 1.1 nice命令 的功能 nice命令的功能是用于调整进程的…

AP ERP与汉得SRM系统集成案例(制药行业)

一、项目环境 江西某医药集团公司&#xff0c;是一家以医药产业为主营、资本经营为平台的大型民营企业集团。公司成立迄今&#xff0c;企业经营一直呈现稳健、快速发展的态势&#xff0c; 2008 年排名中国医药百强企业前 20 强&#xff0c;2009年集团总销售额约38亿元人民币…

原码、补码、反码、移码是什么?

计算机很多术语翻译成中文之后&#xff0c;不知道是译者出于什么目的&#xff0c;往往将其翻译成一个很难懂的名词。 奇怪的数学定义 下面是关于原码的“吐槽”&#xff0c;可以当作扩展。你可以不看&#xff0c;直接去下一章&#xff0c;没有任何影响。 原码的吐槽放在前面是…

配置单区域OSPF

目录 引言 一、搭建基础网络 1.1 配置网络拓扑图如下 1.2 IP地址表 二、测试每个网段都能单独连通 2.1 PC0 ping通Router1所有接口 2.2 PC1 ping通Router1所有接口 2.3 PC2 ping通Router2所有接口 2.4 PC3 ping通Router2所有接口 2.5 PC4 ping通Router3所有接口 2.…