C++ 仿函数的分类

2023-11-01

一,概述
        仿函数(functor),就是使一个类的使用看上去象一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。
  有些功能的的代码,会在不同的成员函数中用到,想复用这些代码。

                            1)公共的函数,可以,这是一个解决方法,不过函数用到的一些变量,就可能成为公共的全局变量,再说为了复用这么一片代码,就要单立出一个函数,也不是很好维护。

                            2)仿函数,写一个简单类,除了那些维护一个类的成员函数外,就只是实现一个operator(),在类实例化时,就将要用的,非参数的元素传入类中。


二,仿函数(functor)在各编程语言中的应用

  1)C语言使用函数指针回调函数来实现仿函数,例如一个用来排序的函数可以这样使用仿函数
  

[html]  view plain  copy
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. //int sort_function( const void *a, const void *b);  
  4. int sort_function( const void *a, const void *b)  
  5. {     
  6.     return *(int*)a-*(int*)b;  
  7. }  
  8.   
  9. int main()  
  10. {  
  11.      
  12.    int list[5] = { 54, 21, 11, 67, 22 };  
  13.    qsort((void *)list, 5, sizeof(list[0]), sort_function);//起始地址,个数,元素大小,回调函数   
  14.    int  x;  
  15.    for (x = 0; x < 5; x++)  
  16.           printf("%i\n", list[x]);  
  17.                     
  18.    return 0;  
  19. }  

        2)在C++里,我们通过在一个类中重载括号运算符的方法使用一个函数对象而不是一个普通函数。

[html]  view plain  copy
  1. #include <iostream>  
  2. #include <algorithm>  
  3.   
  4. using namespace std;  
  5. template<typename T>  
  6. class display  
  7. {  
  8. public:  
  9.     void operator()(const T &x)  
  10.     {  
  11.         cout<<x<<" ";   
  12.     }   
  13. };   
  14.   
  15.   
  16. int main()  
  17. {  
  18.     int ia[]={1,2,3,4,5};  
  19.     for_each(ia,ia+5,display<int>());   
  20.       
  21.     return 0;   
  22. }   


三,仿函数在STL中的定义

        要使用STL内建的仿函数,必须包含<functional>头文件。而头文件中包含的仿函数分类包括

         1)算术类仿函数

               加:plus<T>

               减:minus<T>

               乘:multiplies<T>

               除:divides<T>

               模取:modulus<T>

               否定:negate<T>

例子:

[html]  view plain  copy
  1. #include <iostream>  
  2. #include <numeric>  
  3. #include <vector>   
  4. #include <functional>   
  5. using namespace std;  
  6.   
  7. int main()  
  8. {  
  9.     int ia[]={1,2,3,4,5};  
  10.     vector<int> iv(ia,ia+5);  
  11.     cout<<accumulate(iv.begin(),iv.end(),1,multiplies<int>())<<endl;   
  12.       
  13.     cout<<multiplies<int>()(3,5)<<endl;  
  14.       
  15.     modulus<int>  modulusObj;  
  16.     cout<<modulusObj(3,5)<<endl; // 3   
  17.     return 0;   
  18. }   


         2)关系运算类仿函数

               等于:equal_to<T>

               不等于:not_equal_to<T>

               大于:greater<T>

               大于等于:greater_equal<T>

               小于:less<T>

               小于等于:less_equal<T>

              从大到小排序:

[html]  view plain  copy
  1. #include <iostream>  
  2. #include <algorithm>  
  3. #include <vector>   
  4.   
  5. using namespace std;  
  6.   
  7. template <class T>   
  8. class display  
  9. {  
  10. public:  
  11.     void operator()(const T &x)  
  12.     {  
  13.         cout<<x<<" ";   
  14.     }   
  15. };  
  16.   
  17. int main()  
  18. {  
  19.     int ia[]={1,5,4,3,2};  
  20.     vector<int> iv(ia,ia+5);  
  21.     sort(iv.begin(),iv.end(),greater<int>());  
  22.     for_each(iv.begin(),iv.end(),display<int>());   
  23.     return 0;   
  24. }   

            3)逻辑运算仿函数

                 逻辑与:logical_and<T>

                 逻辑或:logical_or<T>

                 逻辑否:logical_no<T>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 仿函数的分类 的相关文章

随机推荐

  • 基于C++实现的职工信息管理系统

    调用命令的cpp文件 Main cpp include
  • SQL注入之联合注入(一)

    SQL注入联合查询 注入流程 1 获取字段总数 order by group by select 1 2 3 进行连接查询 union select 1 2 3 2 获取数据库 select databale 查看当前数据库名 select
  • css隐藏溢出滚动条

    Chrome Safari div webkit scrollbar display none firefox div scrollbar width none ms overflow style none IE 10 overflow x
  • 目标检测入门——01目标检测概念及数据集

    目标检测入门 01目标检测概念及数据集 1 目标检测 1 1目标检测是什么 在入门阶段 大家经常会混淆分类任务和检测任务 分类任务是要明确图中是什么 属于哪一类 比如是猫还是狗 检测任务是要明确图中有什么 在什么位置 需要用目标框框出来 是
  • Windows安装配置Tomcat服务器教程 ——外网远程访问

    文章目录 前言 1 本地Tomcat网页搭建 1 1 Tomcat安装 1 2 配置环境变量 1 3 环境配置 1 4 Tomcat运行测试 1 5 Cpolar安装和注册 2 本地网页发布 2 1 Cpolar云端设置 2 2 Cpola
  • Neo4j ① <图论>图,节点,关系,属性<知识图谱和图库>图谱,图库,优势<基础>模块,应用场景,环境搭建,浏览器

    目录 第一部分 图 和 Neo4j 1 1 图论 1 1 1 图论起源 柯尼斯堡 Konigsberg 七桥问题 1 1 2 图 和 节点 1 1 3 节点关系表达 1 1 4 属性图模型规则 1 2 知识图谱和图库 1 2 1 知识图谱
  • python selenium对应版本报错及无法找到selenium

    1 点击画红线的地方红色小灯泡 下载 cmd pip show selenium查看是否安装selenium 成功的截图如下 2 此时再次运行 发现Message session not created This version of Ch
  • JWT 续签和多设备登录

    JWT java web token 由头部 载荷 签名三部分组成 其中头部和载荷仅使用了base64进行编码 所以载荷尽量不要传递一些敏感信息 比如 密码之类的 签名主要是用于验签 防止载荷被抓包篡改 这里直接切入主题 续签 jwt to
  • java 2进制常量_【二】Java变量与常量

    1 标识符 标识符 identifier 是指用来标识某个实体的一个符号 在不同的应用环境下有不同的含义 在计算机编程语言中 标识符是用户编程时使用的名字 用于给变量 常量 函数 语句块等命名 以建立起名称与使用之间的关系 标识符通常由字母
  • 解决Flutter旋转屏幕状态栏空缺的问题

    问题 最近要实现一个视频播放器 全屏播放时需要旋转屏幕 把案例拿出来试了一下 旋转屏幕后呈现的状态是这样 解决办法 打开项目下android app src main res values styles xml 添加
  • 对象相等判断&&值传递

    文章目录 对象相等判断 和 equals 的区别是什么 hashCode 与 equals 重要 对象的相等与指向他们的引用相等 两者有什么不同 值传递 对象相等判断 和 equals 的区别是什么 它的作用是判断两个对象的地址是不是相等
  • STP协议详解

    STP协议详解 文章目录 STP协议详解 前言 一 STP协议的运行原理 二 STP协议中ROOT RP DP的选举规则 三 端口状态disable listening learning forwarding blocking所代表的含义
  • vue3组合式api 父子组件数据同步v-model语法糖的用法

    V model 大多数情况是用在 表单数据上的 但它不止这一个作用 父子组件的数据同步 有一个 语法糖 v model 这个方法简化了语法 在elementplus中 都有很多地方使用 所以我们要理解清楚 父组件 使用 v model 向子
  • 【牛客SQL】SQL10 获取所有非manager的员工emp_no

    题目描述 描述 有一个员工表employees简况如下 有一个部门领导表dept manager简况如下 请你找出所有非部门领导的员工emp no 以上例子输出 示例1 输入 drop table if exists dept manage
  • 前端学习——jQuery基础

    一 引入jQuery的js文件 此处是下载好的jquery的js文件 也可以引入cdn 二 jQuery的入口函数 三 DOM对象和jQuery对象 div div 建一个盒子
  • react——state(状态机)

    h1 h1 h1 react state 状态 h1 p react把组件看成是一个状态机 state machines 通过与用户的交互 实现不同状态渲染UI 让用户界面和数据保持一致 p p react里 只需要更新组件的state 然
  • 【Qt教程】1.7 - Qt5带参数的信号、信号重载、带参数的槽函数、槽函数重载

    原理 与C 语法一致 信号 槽函数都可以发生重载 使其在名称不变的情况下 传递过程可以携带参数 示例说明 我们从一个最普通的信号槽工程中 来修改 对信号 槽进行重载 使信号 槽携带参数 1 普通信号 工程源码 widget h ifndef
  • rank、dense_rank、row_number函数的区别

    这四个 RANK DENSE RANK NTILE ROW NUMBER 函数 都是用来对数据库中的数据进行排名的 在他们的功能各有千秋 下面介绍一下这四个函数的功能和用法 首先创建一个Student表 CREATETABLEStudent
  • 树莓派安装opencv教程

    我使用的镜像版本为 Linux version 5 10 103 v7l dom buildbot arm linux gnueabihf gcc 8 Ubuntu Linaro 8 4 0 3ubuntu1 8 4 0 使用Python3
  • C++ 仿函数的分类

    一 概述 仿函数 functor 就是使一个类的使用看上去象一个函数 其实现就是类中实现一个operator 这个类就有了类似函数的行为 就是一个仿函数类了 有些功能的的代码 会在不同的成员函数中用到 想复用这些代码 1 公共的函数 可以