仿函数详解

news2025/1/19 23:04:14

目录

1、函数对象

2、谓词

2.1、一元谓词(谓词有一个参数)

2.1.1、普通函数提供策略

2.1.2、仿函数(上面的函数调用)提供策略

2.1.3、一元谓词全部代码

 2.1、二元谓词(谓词有两个参数)

​编辑

3、内建函数对象


1、函数对象

重载了函数调用运算符()的类 实例化的对象 就叫做函数对象

函数对象+ ()触发 重载函数调用运算符 执行 ==》类似函数调用 (仿函数)

#include <iostream>

using namespace std;
class Print
{
public:
    void operator()(char *str)
    {
        cout<<str<<endl;
    }
};
void test01()
{
    Print ob;
    ob("hello world");
    Print()("hello wprld");
}

int main(int argc, char *argv[])
{
    test01();
    return 0;
}


如果一个函数对象有一个参数叫做 一元函数对象

如果一个函数对象有两个参数叫做 二元函数对象

若果一个函数对象有三个参数叫做 多元函数对象

2、谓词

返回值类型 为 bool 类型的 普通函数或者 仿函数都叫做 谓词

如果谓词有一个参数 叫做一元谓词,但是一元谓词用于查找元素

如果参数有两个参数 叫做二元谓词,但是二元谓词用于容器中元素排序

2.1、一元谓词(谓词有一个参数)

用于查找容器中的元素

2.1.1、普通函数提供策略

bool greaterThan30(int value)
{
    return value>30;
}
//普通函数提供策略  函数名
ret = find_if(v1.begin(), v1.end(), greaterThan30);

greaterThan30函数参数为int类型,是因为底层中find_if函数的第三个参数是greaterThan30(参数为int类型)的入口地址,find_if将迭代器中的每一个元素都送到 greaterThan30(参数为int类型)函数进行比较,所以必然greaterThan30(参数为int类型)函数的参数为int 类型

2.1.2、仿函数(上面的函数调用)提供策略

class GreaterThan30
{
public:
    bool operator()(int value)     //find_if将迭代器中的每一个元素放入该成员函数中比较
    {
        return value>30;
    }
};
 //仿函数提供策略 类名称+()
    ret = find_if(v1.begin(), v1.end(), GreaterThan30());

2.1.3、一元谓词全部代码

//谓词的演示
#include<vector>
#include<algorithm>
bool greaterThan30(int value)
{
    return value>30;
}
class GreaterThan30
{
public:
    bool operator()(int value)
    {
        return value>30;
    }
};

void test02()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(30);
    v1.push_back(50);
    v1.push_back(70);
    v1.push_back(90);

    //find_if条件查找, 来自算法头文件 #include<algorithm>
    vector<int>::iterator ret;
    //普通函数提供策略  函数名
    //ret = find_if(v1.begin(), v1.end(), greaterThan30);
    //仿函数提供策略 类名称+()
    ret = find_if(v1.begin(), v1.end(), GreaterThan30());
    if(ret != v1.end())
    {
        cout<<"寻找的结果:"<<*ret<<endl;
    }
}
int main(int argc, char *argv[])
{
    test02();
    return 0;
}

 2.1、二元谓词(谓词有两个参数)

函数参数传递规律和一元谓词一样,用于容器中元素排序——算法排序

//二元谓词的演示
#include<vector>
#include<algorithm>


void printVectorAll(vector<int> &v)
{
    vector<int>::iterator it;
    for(it=v.begin(); it!=v.end(); it++)
    {
        cout<<*it<<" ";
    }
    cout<<endl;
}

bool myGreaterInt(int v1, int v2)
{
    return v1>v2;
}
class MyGreaterInt1
{
public:
    bool operator()(int v1, int v2)
    {
        return v1>v2;
    }
};
void test03()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(50);
    v1.push_back(30);
    v1.push_back(90);
    v1.push_back(70);

    cout<<"原始数据:";

    printVectorAll(v1);


    sort(v1.begin(), v1.end());  //默认排序方法是从小到大

    cout<<"\n"<<"使用 sort 的默认排序规则:";

    printVectorAll(v1);


    sort(v1.begin(), v1.end(), myGreaterInt);

    cout<<"\n"<<"使用全局普通函数,修改 sort 的默认排序规则:";

    printVectorAll(v1);


    sort(v1.begin(), v1.end(),MyGreaterInt1());

    cout<<"\n"<<"使用仿函数,修改 sort 的默认排序规则:";

    printVectorAll(v1);

    sort(v1.begin(), v1.end(), greater<int>() );    //sort支持随机访问的容器,而 list 不是随机访问的容器,所以它是自己提供排序算法,而不使用 #include<algorithm>中的sor排序算法

    cout<<"\n"<<" 使用算法库提供的方法,修改 sort 的默认排序规则:";

    printVectorAll(v1);
}

int main(int argc, char *argv[])
{
    test03();
    return 0;
}

3、内建函数对象

1 6 个算数类函数对象 , 除了 negate 是一元运算,其他都是二元运算。
2 template < class T > T plus < T > // 加法仿函数
3 template < class T > T minus < T > // 减法仿函数
4 template < class T > T multiplies < T > // 乘法仿函数 5 template < class T > T divides < T > // 除法仿函数
6 template < class T > T modulus < T > // 取模仿函数
7 template < class T > T negate < T > // 取反仿函数
8 6 个关系运算类函数对象 , 每一种都是二元运算。
9 template < class T > bool equal_to < T > // 等于
10 template < class T > bool not_equal_to < T > // 不等于
11 template < class T > bool greater < T > // 大于
12 template < class T > bool greater_equal < T > // 大于等于
13 template < class T > bool less < T > // 小于
14 template < class T > bool less_equal < T > // 小于等于
15 逻辑运算类运算函数 , not 为一元运算,其余为二元运算。
16 template < class T > bool logical_and < T > // 逻辑与
17 template < class T > bool logical_or < T > // 逻辑或
18 template < class T > bool logical_not < T > // 逻辑非

//使用内建函数对象演示
#include<vector>
#include<algorithm>
void test03()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(50);
    v1.push_back(30);
    v1.push_back(90);
    v1.push_back(70);

    cout<<"原始数据:";

    printVectorAll(v1);

    sort(v1.begin(), v1.end(), greater<int>() );    //sort支持随机访问的容器,而 list 不是随机访问的容器,所以它是自己提供排序算法,而不使用 #include<algorithm>中的sor排序算法

    cout<<"\n"<<"使用内建函数对象,修改 sort 的默认排序规则:";

    printVectorAll(v1);
}

int main(int argc, char *argv[])
{
    test03();
    return 0;
}

 使用适配器将两个参数绑定为一个参数,使 find_if 函数不能出错,方便程序查询正确的结果,因为 find_if 本身是三个参数,你要传递四个参数,所以只能使用适配器

void test04()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(30);
    v1.push_back(50);
    v1.push_back(70);
    v1.push_back(90);

    //find_if条件查找
    vector<int>::iterator ret;

    ret = find_if(v1.begin(), v1.end(), bind2nd(greater<int>(), 30)  );   //使用适配器将两个参数绑定为一个参数,使 find_if 函数不能出错,方便程序查询正确的结果,因为 find_if 本身是三个参数,你要传递四个参数,所以只能使用适配器
    if(ret != v1.end())
    {
        cout<<"寻找的结果:"<<*ret<<endl;
    }
}

int main(int argc, char *argv[])
{
    test04();
    return 0;
}

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

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

相关文章

Ansys Zemax | 如何模拟 LED 及其它复杂光源

概述 在使用非序列时&#xff0c;对照明系统进行精确模拟的第一步总是要正确建立光源模型。OpticStudio 提供了多种精确模拟光源的方法。这篇文章介绍了如何在非序列模式下使用径向光源 (Source Radial), 光源文件 (Source File) 以及通过建立其他复杂几何体&#xff0c;来对le…

Oracle与Mysql求连续天数的数据

问题&#xff1a;最近有开发需求&#xff0c;查询最近一个月连续天数>2的数据项&#xff0c;我这里数据库日期存储的是yyyymmdd&#xff0c;字符串 (可自行根据自身情况修改) 思路&#xff1a;如果可以找到连续日期的开始与结束时间&#xff0c;那么就可以 where 日期 betw…

D. Shortest Cycle(floyd求最小环)

Problem - D - Codeforces 给你n个整数a1,a2,..., ana1,a2,...,an。考虑n个节点的图&#xff0c;其中节点ii, jj (i≠ji≠j)是相连的&#xff0c;当且仅当&#xff0c;aiaiAND aj≠0aj≠0&#xff0c;其中AND表示位数和操作。 请找出该图中最短周期的长度&#xff0c;或确定它…

数据库锁表原因、排查、解决

数据库锁表原因、排查、解决 一.场景场景1场景2 二.原因三.排查四.解决方案 一.场景 场景1 锁表通常发生在DML&#xff08; insert 、update 、delete &#xff09; A操作进行全量数据同步&#xff0c;对整个表的粒度进行上锁&#xff0c;导致B操作只能等待A操作完成才能进入…

Vue中mixins(混入)的介绍和使用

什么是Mixin&#xff1f; 想要使用一个事物或者工具&#xff0c;我们首要先了解它是什么&#xff0c;这样我们才好对症下药。 其实Mixin不是Vue专属的&#xff0c;可以说它是一种思想&#xff0c;也可以说它就是混入的意思&#xff0c;在很多开发框架中都实现了Mixin(混入)&a…

我的第一本书终于要印刷了!

终于要印刷了 编辑发来了一个好消息&#xff0c;我的书最快下周就可以印刷出版了。 从开始动笔到提交第一稿&#xff0c;前后有1年的时间&#xff0c; 紧接着和出版社胡老师一起修改&#xff0c; 从一审、二审、三审&#xff0c; 到一校、二校、三校&#xff0c; 确认书…

MobileNetV3详细原理(含torch源码)

作者&#xff1a;爱笑的男孩。 个人简介&#xff1a;打工人。 持续分享&#xff1a;机器学习、深度学习、python相关内容、日常BUG解决方法及Windows&Linux实践小技巧。 如发现文章有误&#xff0c;麻烦请指出&#xff0c;我会及时去纠正。有其他需要可以私信我或者发我邮箱…

企业对外投资为何一定要申请境外投资备案?

随着贸易经济全球化的发展&#xff0c;国内外企业也纷纷把目标转向海外市场&#xff0c;尤其香港&#xff0c;日本&#xff0c;东南亚等地的投资有增无减。 境外投资备案&#xff0c;就是在中国境内设立的公司主体对中国以外的国家进行投资&#xff0c;需要在商务部和发改委进…

高级数据结构与算法 | 自适应基数树(Adaptive Radix Tree)

文章目录 AdaptiveRadixTree基本介绍自适应节点内部节点叶子节点 高度压缩Path CompressionLazy Expansion 算法SearchInsertDeleteBulk loading 并发乐观锁耦合读优化写排除&#xff08;ROWEX&#xff09;适配 ROWEX节点替换路径压缩 AdaptiveRadixTree 基本介绍 论文链接&am…

在win10中使用webdriver

一、察看并下载webdriver 查看 下载&#xff1a; 地址为&#xff1a; CNPM Binaries Mirror (npmmirror.com)https://registry.npmmirror.com/binary.html?pathchromedriver/ 找到对应的版本&#xff0c;最后面的数字不一定要完全相同 二、安装 参考&#xff1a; Python…

设计模式-工厂方法模式

大话设计模式这本书反反复复学过好多遍了&#xff0c;每一次学都会有不同的认识&#xff0c;接下来谈谈我最近学习工厂的一次感受&#xff1b; 发展&#xff1a; 一个计算器的例子从不使用工厂到分离出前端、后端&#xff0c;到使用简单工厂再到使用工厂方法&#xff0c;每一步…

第一性原理计算在材料分析中的应用及未来发展趋势

第一性原理计算是一种理论计算方法&#xff0c;能够基于量子力学原理对物质的性质进行高精度预测。它已经成为材料科学研究中不可或缺的工具&#xff0c;帮助我们了解材料的基本特性&#xff0c;优化材料的性能&#xff0c;并发现新的材料。 一、第一性原理计算的基本原理 第一…

zabbix故障排查

zabbix server服务问题可以查看server日志 tail -f /var/log/zabbix/zabbix_server.log 根据日志中的error报错提示分析原因 zabbix agent服务问题可以查看agent日志 tail -f /var/log/zabbix/zabbix_agentd.log 根据日志中的error报错提示分析原因 zabbix的nginx服务问题可…

Window下编译PJSIP,不编译Media模块

Windows系统下使用VS1027进行编译PJSIP。 下载地址 PJSIP的地址&#xff1a;https://github.com/pjsip/pjproject 在线clone太慢的话&#xff0c;可以直接在这里下载比clone会快很多&#xff1a; https://github.com/pjsip/pjproject/releases 安装OpenSSL 直接安装已经编译…

TitanIDE 新版本来袭,全新“效能看板”上线

TitanIDE产品团队于4月17日晚发布了TitanV2.6.3版本&#xff0c;作为一次重要的版本迭代&#xff0c;新版本主要增加/优化了以下重大功能&#xff1a; 全新效能看板上线&#xff0c;研发进度一目了然&#xff1b;新增代码拷贝、下载权限管理功能&#xff1b;项目启动提速&…

创客匠人视频号全域增长落地班成功举办

以专业赋能好老师&#xff0c;打造知识付费商业IP&#xff0c;借助视频号布局商业增长第二曲线。 4月15日-16日&#xff0c;泛知识场景数字化服务商创客匠人在厦门举办「视频号全域增长落地班」。 本次大会邀请到创客匠人CEO、中欧EMBA蒋洪波&#xff0c;福布斯环球联盟创新企业…

电脑开机进不了系统怎么办?电脑开机错误无法显示桌面解决方法

电脑开机进不了系统怎么办&#xff1f;很多用户都有遇到过电脑正常开机&#xff0c;但是无法进入到系统桌面的情况。其实遇到这个问题&#xff0c;大部分的原因都是因为系统出现了故障损坏&#xff0c;我们可以去通过U盘来重装系统的方法进行解决。一起来看看以下的具体操作方法…

jar包反编译工具(java-decompiler)

五种反编译工具 1.jd-gui 下载地址&#xff1a;http://java-decompiler.github.io/ 优点&#xff1a;反编译的源代码基本符合&#xff0c;没有乱七八糟新增的修饰符 缺点&#xff1a;反编译过程耗时较长&#xff08;50MB需要10分钟左右&#xff09; 无法还原内部类 可以查看对…

DDPG算法详解

DQN算法详解 一.概述 概括来说&#xff0c;RL要解决的问题是&#xff1a;让agent学习在一个环境中的如何行为动作(act)&#xff0c; 从而获得最大的奖励值总和(total reward)。 这个奖励值一般与agent定义的任务目标关联。 agent需要的主要学习内容&#xff1a;第一是行为策略…

leetcode刷题(5)

各位朋友们&#xff0c;大家好&#xff0c;今天是我leedcode刷题的第五篇&#xff0c;我们一起来看看吧。 文章目录 栈的压入&#xff0c;弹出序列题目要求用例输入提示做题思路代码实现C语言代码实现Java代码实现 最小栈题目要求用例输入提示做题思路代码实现Java代码实现 栈的…