博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++仿函数
阅读量:2234 次
发布时间:2019-05-09

本文共 2088 字,大约阅读时间需要 6 分钟。

根据,仿函数也叫函数对象(Function Object, or Functor),定义就是任何可以像函数一样被调用的对象。一个普通的函数是函数对象,一个函数指针当然也是,广义上说任何定义了operator()的类对象都可以看作是函数对象。

最基本的函数对象概念包括, (一元函数), 和(二元函数),分别可以f(),f(x),f(x, y)的形式调用。当然这个概念还可以推广到接受多于两个参数的ternary function。

返回bool类型的仿函数比较特殊,比如返回bool的Unary Function叫做(谓词),返回bool的Binary Function叫做。

有两个概念需要区分:function objects(函数对象)和adaptable function objects(可适应的函数对象)。一般地说,虽然一个Function Objects对它的参数的类型有要求,但是操作符operator()可以重载,可以是模板,或者两者兼有。也就是说,没有准确地方法获得这个Function Objects的参数和返回类型的信息。但是一个Adaptable Function Objects必须以typedef的形式指定他的参数和返回值得类型。如果一个类型F0是,那么它必须定义F0::result_type。类似地,如果F1是,那么它必须定义F1::argument_type和F1::result_type。如果F2是那么它必须定义F2::first_argument_type,F2::second_argument_type和F2::result_type。STL提供了 and 以简化 and 的定义。

Adaptable Function Objects是非常重要的,因为他们可以被function object adaptors(函数对象适配器,用来操作和控制其它函数对象)使用。STL提供了许多function object adaptors,包括unary_negate,unary_compose和binary_compose,用来对函数对象进行组合。

最后,STL包括了许多不同的预定义的函数对象,包括算子(plus,minus,multiplies,divides,modulus和negate),算术比较(equal_to,not_equal_to,greater,less,greater_equal和less_equal),和逻辑操作(logical_and,logical_or和logical_not)。这样你就可以不用手动写新的函数对象而是用这些函数对象就可以组合出相当复杂的操作。

例子

将一个vector<int>用随机数填充。这里,一个函数指针就是一个函数对象。

vector
V(100); generate(V.begin(), V.end(), rand);
按照绝对值大小排序一个vector<int>。这里,函数对象是一个用户定义的class类型。
struct less_mag : public binary_function
{bool operator()(double x, double y) { return fabs(x) < fabs(y); } }; vector
V; ... sort(V.begin(), V.end(), less_mag());
对一个vector<int>进行求和。这里,函数对象是一个可以保存状态的用户定义类型。
struct adder : public unary_function
{ adder() : sum(0) {} double sum; void operator()(double x) { sum += x; } }; vector
V; ... adder result = for_each(V.begin(), V.end(), adder()); [3] cout << "The sum is " << result.sum << endl;
删除list<int>中所有大于100且小于1000的元素
list
L; ... list
::iterator new_end = remove_if(L.begin(), L.end(), compose2(logical_and
(), bind2nd(greater
(), 100), bind2nd(less
(), 1000))); L.erase(new_end, L.end());

转载地址:http://wanbb.baihongyu.com/

你可能感兴趣的文章
阿里云《云原生》公开课笔记 第三章 kubernetes核心概念
查看>>
阿里云《云原生》公开课笔记 第四章 理解Pod和容器设计模式
查看>>
阿里云《云原生》公开课笔记 第五章 应用编排与管理
查看>>
阿里云《云原生》公开课笔记 第六章 应用编排与管理:Deployment
查看>>
阿里云《云原生》公开课笔记 第七章 应用编排与管理:Job和DaemonSet
查看>>
阿里云《云原生》公开课笔记 第八章 应用配置管理
查看>>
阿里云《云原生》公开课笔记 第九章 应用存储和持久化数据卷:核心知识
查看>>
linux系统 阿里云源
查看>>
国内外helm源记录
查看>>
牛客网题目1:最大数
查看>>
散落人间知识点记录one
查看>>
Leetcode C++ 随手刷 547.朋友圈
查看>>
手抄笔记:深入理解linux内核-1
查看>>
内存堆与栈
查看>>
Leetcode C++《每日一题》20200621 124.二叉树的最大路径和
查看>>
Leetcode C++《每日一题》20200622 面试题 16.18. 模式匹配
查看>>
Leetcode C++《每日一题》20200625 139. 单词拆分
查看>>
Leetcode C++《每日一题》20200626 338. 比特位计数
查看>>
Leetcode C++ 《拓扑排序-1》20200626 207.课程表
查看>>
Go语言学习Part1:包、变量和函数
查看>>