C++算法——函数对象\谓词\内置仿函数

目录

函数对象:

函数对象的定义: 

函数对象的本质:

函数对象的特点:

谓词

谓词的形式: 

内置函数对象

算法仿函数

关系仿函数

逻辑仿函数


函数对象:

函数对象的定义: 

C++的函数对象是一个类的实例,其可以像函数一样被调用,并且可以保存状态。

函数对象重载了()运算符,允许其被当做函数来调用。

函数对象的本质:

是一个类对象

函数对象的特点:

  1. 行为类似于函数:函数对象可以被调用,就像调用函数一样,可以接受参数并返回结果。
  2. 状态保持:函数对象可以在调用之间保持状态。因为函数对象是类的对象,可以在类的成员变量中保存状态信息,在多次调用中可以保持这些状态。
  3. 高效性:函数对象的调用比函数指针的调用更高效,因为函数对象可以进行内联操作,无需进行函数调用的开销。

简单使用函数对象:

#include<iostream>class first
{
public:int operator()(int a, int b){count++;return a - b;}int count{ 0 };
};int main()
{first a;std::cout << a(9, 8)<<std::endl;std::cout << a(9, 4) << std::endl;std::cout << a.count;return 0;
}//输出结果是
1
5
2

谓词

谓词是一个函数或函数对象,它接受一个或多个参数,并返回一个布尔值。

谓词通常被用作某个操作的判断条件,返回 true 表示满足条件,返回 false 表示不满足条件。

谓词的形式: 

有五种

  1. 普通函数:这是一个简单的函数,接收一个或多个参数,并返回一个布尔值。
  2. 函数指针:指向一个返回布尔值的函数的指针。
  3. 函数对象:这是重载了()操作符的类的实例,使得它可以像函数一样被调用,并返回布尔值;这类对象也被称为“仿函数”。
  4. Lambda表达式:匿名函数,可以直接在代码中定义并创建,常用于临时性、一次性使用的判断逻辑。
  5. 库定义的函数对象:STL等库中预定义的一些类,这些类的对象也可以作为谓词使用

函数对象的谓词的使用举例说明:

#include<iostream>
#include<algorithm>
#include<vector>
class first
{
public:bool operator()(int a, int b){return a > b;}
};int main()
{first a;std::vector<int>b{2,3,4,77,45};std::sort(b.begin(), b.end(), a);for (auto i = b.begin(); i != b.end(); i++){std::cout << *i << " ";}return 0;
}//输出的结果是
77 45 4 3 2

内置函数对象

 C++标准库提供了一些内置的函数对象,用于在算法函数中方便地实现通用的操作,这些函数对象通常用作谓词或其他函数对象的基础

算法仿函数

std::plus<T>:加法函数对象,用于执行两个值的加法操作。

std::plus<int> add;
int result = add(5, 3); // 返回 8

std::minus<T>:减法函数对象,用于执行两个值的减法操作。

std::minus<int> s;
int result = s(10, 3); // 返回 7

std::multiplies<T>:乘法函数对象,用于执行两个值的乘法操作。

std::multiplies<int> m;
int result = m(4, 5); // 返回 20

std::divides<T>:除法函数对象,用于执行两个值的除法操作。

std::divides<double> d;
double result = d(10.0, 2.0); // 返回 5.0

std::modulus<T>:取模函数对象,用于执行两个值的取模操作。

std::modulus<int> modulus;
int result = modulus(10, 3); // 返回 1

std::negate<T>:取反函数对象,用于执行一个值的取反操作。

std::negate<int> negate;
int result = negate(8); // 返回 -8

关系仿函数

std::less<T>:比较小于关系的函数对象,用于确定一个值是否小于另一个值。

std::less<int> less_than;
bool result = less_than(3, 5); // 返回 true

std::less_equal<T>:比较小于等于关系的函数对象,用于确定一个值是否小于或等于另一个值。

std::less_equal<int> less_equal;
bool result = less_equal(4, 4); // 返回 true

std::greater<T>:比较大于关系的函数对象,用于确定一个值是否大于另一个值。

std::greater<int> greater_than;
bool result = greater_than(7, 3); // 返回 true

std::greater_equal<T>:比较大于等于关系的函数对象,用于确定一个值是否大于或等于另一个值。

std::greater_equal<int> greater_equal;
bool result = greater_equal(6, 6); // 返回 true

std::equal_to<T>:比较相等关系的函数对象,用于确定两个值是否相等。

std::equal_to<int> equal;
bool result = equal(10, 10); // 返回 true

std::not_equal_to<T>:比较不等关系的函数对象,用于确定两个值是否不相等。

std::not_equal_to<int> not_equal;
bool result = not_equal(3, 6); // 返回 true

逻辑仿函数

std::logical_and<T>:逻辑与函数对象,用于执行逻辑与运算。

std::logical_and<bool> logical_and;
bool result = logical_and(true, false); // 返回 false

std::logical_or<T>:逻辑或函数对象,用于执行逻辑或运算。

std::logical_or<bool> logical_or;
bool result = logical_or(true, false); // 返回 true

std::logical_not<T>:逻辑非函数对象,用于执行逻辑非运算。

std::logical_not<bool> logical_not;
bool result = logical_not(true); // 返回 false 

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

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

相关文章

冯喜运:5.13黄金晚间还会跌吗?原油还会涨吗?

【黄金消息面分析】&#xff1a;自5月初以来&#xff0c;黄金和白银一直在享受需求的回归&#xff0c;买家在过去几天加大了力度&#xff0c;一度推动金价重返2370美元上方&#xff0c;白银重返28.5美元上方。不过&#xff0c;经过几天的盘整后&#xff0c;黄金白银价格双双下跌…

【npm】解决npm包突然消失MODULE_NOT_FOUND

今天折腾新特性时需要升级nodejs&#xff0c;安装新版后npm离奇消失了。C:\Users\**用户名\AppData\Roaming\npm\node_modules下只有cnpm&#xff0c;没有npm的目录。重装nodejs也不好使。 机智如我&#xff0c;试了下cnpm -v是正常的&#xff0c;而且能看到nodejs&#xff0c;…

什么是.faust勒索病毒?应该如何防御?

faust勒索病毒详细介绍 faust勒索病毒是一种新型的勒索软件&#xff0c;最早出现在2018年。该病毒通过加密计算机系统中的文件并要求支付赎金来解锁文件&#xff0c;从而获取经济利益。与传统的勒索软件相比&#xff0c;faust勒索病毒采用了更加先进的加密算法和隐藏技术&#…

山洪灾害无线预警广播系统的主要设备和功能

一、背景 山洪泥石流是指在山区或者其他沟谷深壑&#xff0c;地形险峻的地区&#xff0c;因为暴雨、暴雪或其他自然灾害引发的洪水、山体滑坡并携带有大量泥沙以及石块的特殊洪流。山洪泥石流等地质灾害具有突然性以及流速快&#xff0c;流量大&#xff0c;物质容量大和破坏力…

光数据传送器|光通讯传感器极速版OPT系列尺寸与安装步骤

光数据传送器|光通讯传感器极速版OPT系列是利用可见光及不可见光作为信息载体&#xff0c;无需光纤、网线等有线介质&#xff0c;在空中直接进行信息传输的无线方式通信。驱动光源以可见光及不可见光的高速明暗变化来传输数字信号&#xff0c;以极高光频率双向发射接收光信号&a…

python跟C++选哪个?

选择使用Python还是C取决于你的具体需求和项目背景。我这里有一套编程入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习编程&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信22&#xff0c;我在后台发给你。 在通信工程行业…

QT C++(QWidget类及其常见的属性)

文章目录 1. QWidget类及其常见的属性 1. QWidget类及其常见的属性 QT各种控件都是继承自QWidget类&#xff0c;QWidget类是QT控件体系中通用的部分。 QWidget属性如下图 常见的QT属性为&#xff1a; enabled&#xff1a;描述控件是否处于可用状态&#xff08;禁用状态这个…

Python 求高斯误差函数 erf 和 erfc

文章目录 Part.I IntroductionPart.II 概念定义Chap.I 误差函数 erfChap.II 误差函数补 erfc Part.II 求值与绘图Chap.I 求取方式Chap.II 绘图 Reference Part.I Introduction 本文将对误差函数&#xff08;ERror Function, ERF&#xff09;进行简单的介绍&#xff0c;并探索如…

【Flutter】极光推送配置流程(VIVO/OPPO/荣耀厂商通道) 章三

前言 很高兴大家来看小编写的文章&#xff5e;&#xff5e; 继【Flutter】极光推送配置流程(极光通道/华为厂商/IOS) 章一 继【Flutter】极光推送配置流程(小米厂商通道) 章二 接下配置VIVO/OPPO/华为荣耀的厂商通道 所有截图来源于公司项目&#xff0c;所以会有大量马赛克&am…

【C/C++】详解不同场景下的文件读写操作

&#x1f517; 运行环境&#xff1a;C/C &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 &#x1f510;#### 防伪水印——左手の明天 ####&#x1f510; &#x1f497; 大家好&…

虚拟数字人及AI相关应用分享

一、虚拟数字人 1、简介 虚拟数字人可分为基础类和仿真智能类。可用于直播的&#xff0c;一般是仿真智能类&#xff1b;基础类动作缓慢&#xff0c;体验差&#xff0c;很容易被直播平台封号。 目前各大短视频平台上介绍的数字人&#xff0c;出于营销目的&#xff0c;有夸大宣传…

代码随想录35期Day38-Java(Day37休息)

Day38题目 LeetCode509.斐波那契数列 核心思想:很简单dp[i]dp[i-1]dp[i-2].这里用了数组存储的形式,也可以递归 class Solution {public int fib(int n) {int[] dp new int[n2];dp[0] 0;dp[1] 1;for(int i 2 ; i < n ; i ){dp[i] dp[i-1] dp[i-2];}return dp[n];} …

go语言冒泡排序算法之泛型实现 支持整型,浮点型和字符串排序 golang bubble sort general

冒泡排序是一个比较经典的基础算法&#xff0c; 是学习编程的同学们所必备的算法之一&#xff0c;今天就介绍一个go语言里面使用泛型实现的冒泡排序算法&#xff0c; 支持字符串 string&#xff0c;数字 int float 等的排序。 在go语言中通常我们在进行数据比较时都是使用的c…

prophet时间序列模型水质预测应用

前言 此前已经分析了&#xff0c;ARIMA 模型在水质预测中的应用&#xff0c;今天用 prophet 模型测试下在水质预测中的效果。 Prophet 简介 Prophet 是 Facebook 于2017年开源的一个时间序列预测框架&#xff0c;特别适合于处理具有明显趋势性和季节性的数据。该模型设计初衷…

领略Java内部类的“内部”

内部类有两种情况&#xff1a; (1) 在类中定义一个类(私有内部类&#xff0c;静态内部类) (2) 在方法中定义一个类(局部内部类&#xff0c;匿名内部类) 1、私有内部类 —— 在方法之间定义的内部类&#xff0c;非静态 我们首先看看类中内部类的两个特点&#xff1a; (1) 在外部…

springboot3项目练习详细步骤(第三部分:文章管理模块)

目录 发布文章 接口文档 业务实现 自定义参数校验 项目参数要求 实现思路 实现步骤 文章列表(条件分页) 接口文档 业务实现 mapper映射 更新文章 接口文档 业务实现 获取文章详情 接口文档 业务实现 删除文章 接口文档 业务实现 文章管理业务表结构…

数据可视化训练第6天(美国人口调查获得关于收入与教育背景的数据,并且可视化)

数据来源 https://archive.ics.uci.edu/dataset/2/adult 过程 首先&#xff1b;关于教育背景的部分翻译有问题。 本次使用字典嵌套记录数据&#xff0c;并且通过lambda在sorted内部进行对某个字典的排序&#xff0c;最后用plotly进行绘图 本次提取数据的时候&#xff0c;用到…

ubuntu server 22.04.4 系统安装详细教程

本教程使用vmware workstation 17创建虚拟机进行安装演示&#xff0c;安装方式和真机安装没有区别。 1、下载镜像 下载ubuntu server版本系统镜像&#xff0c;官网下载地址&#xff1a;https://cn.ubuntu.com/download/server/step1 注意&#xff1a;自己下载时需要确认是否是…

MySQL索引的存储结构

2.3.2. 索引存储结构 索引存储结构有堆表和索引组织表两种方式。 堆表和索引组织表有什么区别&#xff1f; 堆表&#xff1a; 数据和索引是分开存放的&#xff0c;索引是排序后的&#xff0c;但堆数据是无序的进行的都是随机访问&#xff0c;索引的叶子节点中存放的是数据在…

基于springboot + vue 实现的简易博客系统

项目效果图 登陆页面 文章列表 发表文章 用户管理 栏目管理 数据统计 后端技术栈后端主要采用了&#xff1a; 1.SpringBoot 2.SpringSecurity 3.MyBatis 4.部分接口遵循Restful风格 5.MySQL 前端技术栈前端主要采用了&#xff1a; 1.Vue 2.axios 3.Elemen…