函数对象

概念:

  • 重载函数调用操作符的类,其对象称为函数对象
  • 函数对象使用重载的()时,行为类似函数调用,也叫仿函数

本质:
函数对象(仿函数)是一个类,不是一个函数

函数对象使用

  • 函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值
class myadd
{public:int operator()(int a,int b){return a + b;}
};
void test1()
{myadd md;cout << md(2, 4) << endl;
}
  • 函数对象超出普通函数的概念,函数对象可以有自己的状态
class mystring
{public:mystring(){this->number = 0;}void operator()(string name){cout << name << endl;this->number++;}int number;
};
void test2()
{mystring ms;ms("I love you");ms("I love you");ms("I love you");cout <<"调用次数为:"<< ms.number << endl;
}
  • 函数对象可以作为参数传递
class mystring
{public:void operator()(string name){cout << name << endl;}
};
void myprintf(mystring &mf,string name)
{mf(name);
}
void test3()
{mystring mss;myprintf(mss,"hello C++");
}

谓词

概念:

  • 返回bool类型的仿函数称为谓词
  • 如果operator()接受一个参数,那么叫做一员谓词
  • 如果operator()接受两个参数,那么叫做二员谓词

示例:
一员谓词

//在vector中查找大于5的元素
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class myfind
{public:bool operator()(int val){return val > 5;}
};
void fun()
{vector<int> v;for (int i = 0; i < 10; i++){v.push_back(i);}vector<int>::iterator it=find_if(v.begin(),v.end(),myfind());//find_if()有条件的查找if (it!=v.end()){cout << "找到了大于5的数值" << *it << endl;}else{cout << "没有找到了大于5的数值" << endl;}
}
int main()
{fun();return 0;
}

二员谓词

//使vector降序排列
//二元谓词即有两个参数
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class paixu
{public:bool operator()(int val1,int val2){return val1 > val2;}
};
void test1()
{vector<int> v;v.push_back(30);v.push_back(60);v.push_back(20);v.push_back(40);v.push_back(10);sort(v.begin(),v.end());for (vector<int>::iterator it=v.begin();it!=v.end();it++){cout << *it <<"  ";}cout << endl;sort(v.begin(), v.end(), paixu());for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << "  ";}
}
int main()
{test1();return 0;
}

内建函数对象

概念:

  • STL内建了一些函数对象

分类:

  • 算术仿函数
  • 关系仿函数
  • 逻辑仿函数

用法:

  • 这些仿函数所产生的对象,用法和一般函数完全相同
  • 使用内建函数对象,需要引入头文件#include

算术仿函数:

功能描述:

  • 实现四则运算
  • 其中negate是一元运算,其余的都是二元运算

函数:

  • 返回类型即<>中定义的类型
  • T plus<T>     //加法仿函数
  • T minus<T>     //减法仿函数
  • T multiplies<T>     //乘法仿函数
  • T divides<T>     //除法仿函数
  • T modulus<T>     //取模仿函数
  • T negate<T>     //取反仿函数

示例:

#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>
using namespace std;void test1()
{negate<int> n;cout << n(50) << endl;plus<int> p;cout << p(10,20) << endl;}
int main()
{test1();return 0;
}

关系仿函数

  • 返回的是bool类型

函数

  • bool equal_to<T>     //等于
  • bool not_equal_to<T>     //不等于
  • bool greater<T>     //大于
  • bool greater_equal<T>     //大于等于
  • bool less<T>     //小于
  • bool less_equal<T>     //小于等于

示例:

//使vector降序排列
#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>
using namespace std;void test1()
{vector<int> v;v.push_back(30);v.push_back(60);v.push_back(20);v.push_back(40);v.push_back(10);sort(v.begin(), v.end());for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << "  ";}cout << endl;sort(v.begin(), v.end(), greater<int>());for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << "  ";}}
int main()
{test1();return 0;
}

逻辑仿函数

函数:

  • bool logical_and<T>     //逻辑与
  • bool logical_or<T>     //逻辑或
  • bool logical_not<T>     //逻辑非

示例:

//取非运算
#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>
using namespace std;void test1()
{vector<bool> v;v.push_back(false);v.push_back(true);v.push_back(false);v.push_back(false);v.push_back(true);for (vector<bool>::iterator it = v.begin(); it != v.end(); it++){cout << *it << "  ";}cout << endl;vector<bool> va;va.resize(v.size());transform(v.begin(),v.end(),va.begin(),logical_not<bool>());//搬运算法,将一个vector的元素搬运到另一个vector中for (vector<bool>::iterator it = va.begin(); it != va.end(); it++){cout << *it << "  ";}/*-----------------------------------------------*/logical_not<bool> ln;cout << ln(false) << endl;
}
int main()
{test1();return 0;
}

C++ 之 函数对象相关推荐

  1. 函数对象、 函数对象与容器、函数对象与算法

    一.函数对象 1.函数对象(function object)也称为仿函数(functor) 2.一个行为类似函数的对象,它可以没有参数,也可以带有若干参数. 3.任何重载了调用运算符operator( ...

  2. R语言match函数对象之间的匹配实战

    R语言match函数对象之间的匹配实战 目录 R语言match函数对象之间的匹配实战 #基本语法 #match函数 # 匹配两个向量

  3. python函数装饰函数_Python精进-装饰器与函数对象

    本文为<爬着学Python>系列第四篇文章. 从本篇开始,本专栏在顺序更新的基础上,会有不规则的更新. 在Python的学习与运用中,我们迟早会遇到装饰器,这个概念对于初识装饰器的新手来说 ...

  4. 函数对象,名称空间与作用域,闭包,装饰器

    函数是第一类对象即可以被当做数据取使用 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 1.可以被引用 先看变量可以怎么玩 age=18 x=age 把 ...

  5. python命名空间和闭包_Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】...

    本文实例讲述了Python函数基础用法.分享给大家供大家参考,具体如下: 一.什么是命名关键字参数? 格式: 在*后面参数都是命名关键字参数. 特点: 1.约束函数的调用者必须按照Kye=value的 ...

  6. python编写函数isodd(x)_python函数对象

    适用于python 2.x版本 1. lambda函数 1 func = lambda x, y : x + y2 print func(2, 4) lambda生成一个函数对象,参数是x,y, 返回 ...

  7. 通过 “函数对象”看javascript函数

    #前言 本文主要阐述一些JavaScript行为的深层原因.很多东西都是主观臆测结合编程经验推测出来的. 如有谬误请包涵,也可以联系作者(qq:504451056,email:504451056@qq ...

  8. C++模板学习之函数对象之谓词

    函数对象是用对象来表示的函数: 可以执行operator()的对象都叫做函数对象. 谓词是那些返回bool,operator()操作的函数对象. 考虑如何对一个序列求和: 函数对象的优势在于可以将参数 ...

  9. python 返回函数对象_Python—函数对象与闭包

    一 函数对象 函数对象指的是函数可以被当做"数据"来处理,具体可以分为四个方面的使用. 1.1 函数可以被引用 def index(): print('from index') a ...

  10. python装饰器函数-Python精进-装饰器与函数对象

    本文为<爬着学Python>系列第四篇文章. 从本篇开始,本专栏在顺序更新的基础上,会有不规则的更新. 在Python的学习与运用中,我们迟早会遇到装饰器,这个概念对于初识装饰器的新手来说 ...

最新文章

  1. [动规] hihocoder 1149 回文字符序列
  2. 【五校联考6day2】san
  3. 浅尝EffectiveCSharp_1
  4. 无符号哥伦布指数编码
  5. wdcp支持两种安装方式
  6. 解决浏览器跨域加载本地文件报错 Access to script at ‘xxx‘ from origin ‘null‘ has been blocked by CORS policy
  7. oracle备份出现问题,TSM + Oracle备份出现问题
  8. 工资微软微软员工你了解么??
  9. 《循序渐进Linux(第2版) 基础知识 服务器搭建 系统管理 性能调优 虚拟化与集群应用》——4.7 文本编辑工具vi...
  10. Flink 1.10 和 Hive 3.0 性能对比(附 Demo 演示 PPT)
  11. 单片机作业1_为OLED制作汉字字库_第1部分
  12. node2vec代码实现及详细解析
  13. PyMuPDF 拼版(二)
  14. 芯片技术---芯片到底是什么?
  15. CS相关经典书籍的书评
  16. vim三种工作模式 命令模式、编辑模式、末行(底行)模式
  17. 【前沿技术RPA】 万字吃透UiPath如何处理异常
  18. 计算机视觉期末复习(上)
  19. 加路由时提示Network is unreachable的一种解决方法
  20. 视频教程-Javascript DOM操作-JavaScript

热门文章

  1. 我揣500元开店,赚出了几套房
  2. 辽宁初级药师职称计算机考试时间,一文get!2020年药士\药师\主管药师考试安排详情!...
  3. 偏AUC(partial AUC)或者部分AUC是什么?R语言使用pROC包绘制ROC曲线并定义偏AUC(partial AUC):分别聚焦特异度、敏感度角度
  4. 她,从种蘑菇卖煤球,到开源 Zadig
  5. 蓝桥杯集训·每日一题Week1
  6. java 姓排序_Java中先按照姓名排序在按照年龄排序 代码
  7. 递归和迭代的区别——以DNS为例
  8. 小程序设置字体大小和字体加粗
  9. 在B站学习C语言的第一天
  10. Java--多态(polymorphic),上下转型,多态好处弊端