当前课程知识点:C++语言程序设计进阶 > 第十章 泛型程序设计与C++标准模板库 > 函数对象 > 函数对象
一个行为类似函数的对象
可以没有参数,也可以带有若干参数
其功能是获取一个值,或者改变操作的状态。
例
普通函数就是函数对象
重载了“()”运算符的类的实例是函数对象
使用两种方式定义表示乘法的函数对象
通过定义普通函数(例10-13)
通过重载类的“()”运算符(例10-14)
用到以下算法:
template<class InputIterator, class Type, class BinaryFunction> Type accumulate(InputIterator first, InputIterator last, Type val, BinaryFunction binaryOp);
对[first, last)区间内的数据进行累“加”,binaryOp为用二元函数对象表示的“加”运算符,val为累“加”的初值
#include <iostream> #include <numeric> //包含数值算法头文件 using namespace std; //定义一个普通函数 int mult(int x, int y) { return x * y; }; int main() { int a[] = { 1, 2, 3, 4, 5 }; const int N = sizeof(a) / sizeof(int); cout << "The result by multipling all elements in a is " << accumulate(a, a + N, 1, mult) << endl; return 0; }
//10_14.cpp #include <iostream> #include <numeric> //包含数值算法头文件 using namespace std; class MultClass{ //定义MultClass类 public: //重载操作符operator() int operator() (int x, int y) const { return x * y; } }; int main() { int a[] = { 1, 2, 3, 4, 5 }; const int N = sizeof(a) / sizeof(int); cout << "The result by multipling all elements in a is " << accumulate(a, a + N, 1, MultClass()) //将类multclass传递给通用算法 << endl; return 0; }
用于算术运算的函数对象:
一元函数对象(一个参数) :negate
二元函数对象(两个参数) :plus、minus、multiplies、divides、modulus
用于关系运算、逻辑运算的函数对象(要求返回值为bool)
一元谓词(一个参数):logical_not
二元谓词(两个参数):equalto、notequalto、greater、less、greaterequal、lessequal、logicaland、logical_or
//10_15.cpp #include <iostream> #include <numeric> //包含数值算法头文件 #include <functional> //包含标准函数对象头文件 using namespace std; int main() { int a[] = { 1, 2, 3, 4, 5 }; const int N = sizeof(a) / sizeof(int); cout << "The result by multipling all elements in A is “ << accumulate(a, a + N, 1, multiplies<int>()) << endl; //将标准函数对象传递给通用算法 return 0; }
// 10_16.cpp #include <functional> #include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { int intArr[] = { 30, 90, 10, 40, 70, 50, 20, 80 }; const int N = sizeof(intArr) / sizeof(int); vector<int> a(intArr, intArr + N); cout << "before sorting:" << endl; copy(a.begin(),a.end(),ostream_iterator<int>(cout,"\t")); cout << endl; sort(a.begin(), a.end(), greater<int>()); cout << "after sorting:" << endl; copy(a.begin(),a.end(),ostream_iterator<int>(cout,"\t")); cout << endl; return 0; }
大家好
欢迎回来继续学习
C++语言程序设计
这一节我们来学习函数对象
函数对象
实际上就是一个
行为类似于函数的对象
它可以没有参数
也可以带有若干参数
函数对象的功能
就是获得一个值
或者改变操作的状态
比如说一个普通的函数
就是函数对象
一个重载了
函数调用运算符的类的实例
也就是类的对象
也就是函数的对象
这是函数对象的一个概念图
函数对象呢
分成产生器 一元函数对象
和二元函数对象
产生器是没有参数的
一元函数对象有一个参数
二元函数对象有两个参数
那么一元函数对象呢
它的下级概念
子概念又有一个一元谓词的概念
实际上就是返回值为bool类型的
这个一元函数对象
我们就称它为一元谓词
返回值为
bool类型的二元函数对象
实际上我们就称它为二元谓词
接下来的例题呢
我们用了两种方法来表示
乘法函数对象
一种呢
就是定义一个普通的乘法函数
将函数名就作为函数对象
另一个呢
就是定义一个类
让这个类去重载函数调用运算符
这个函数调用运算符
重载函数实现的功能
也同样是乘法功能
那么这个类的对象
就成为了函数对象
现在我们来看看
这两个例题
分别实现了这两种表示
这里我们定义一个
普通的乘法函数mult
实现两个参数x和y的乘法
然后在主函数中
定义了一个数组
接下来呢
我们要调用accumulate这个算法
对数组起始位置
到结束位置的所有元素
范围内的元素
进行这个mult规定的运算
这个位置是我们可以
传给它一个函数对象的
现在我们将一个普通的函数名
作为函数对象传过去
于是
它就在
这个数组序列的每个元素上
累计进行这个mult
也就是乘法运算
这个1呢是这个累乘的初始值
下面这个程序中呢
我们稍做一点变化
不是定义一个普通函数了
而是定义一个MultClass类
在这个类中呢
重载了函数调用运算符
它实现的功能当然也是乘法
这次呢
我们用这个MultClass对象
作为函数对象传过去
那同样实现了对数组的所有元素
进行累乘的这样的效果
除了我们自己定义函数
定义类去重载函数
调用函数运算符以外
我们也可以使用STL库里面
为我们提供的函数对象
STL库里面提供了
用于算术运算的函数对象
还有用于关系运算
逻辑运算的函数对象
这里列出了常用的用于算术运算
和用于关系运算
逻辑运算的函数对象
包括有一个参数的
有两个参数的
下面这个例题呢
我们利用STL库中
提供的标准函数对象
来实现前面两个例题的功能
在这个程序中呢
我们换成
将标准库中的一个函数对象
实现乘法功能的函数对象
传给accumulate算法
那么同样实现了
将数组各个元素累乘的效果
接下来这个例题呢
使用STL中的二元谓词对象
实现了
将数组由大到小排序的功能
在这个程序中呢
主要的功能是我们要调用
这个排序函数
这个Sort
对序列进行排序
那我们希望呢
对这个向量vector
里面的元素
按由大到小的次序进行排序
那这样我们就传给它一个
二元谓词对象greater
这个greater会返回x大于y的值
也就是说
用它指定了一种
排序的大小比较规则
相当于这样的
那么这个greater的比较规则
就决定了sort最后的排序结果
是按照由大到小的次序进行排序
那我们可以看到
这是排序以后的输出结果
这是排序以前的情况
-导学
--导学
-继承的基本概念和语法
-第七章 继承与派生--继承的基本概念和语法习题
-继承方式
-第七章 继承与派生--继承方式
-基类与派生类类型转换
-第七章 继承与派生--基类与派生类类型转换
-派生类的构造和析构
--派生类的构造函数
--派生类的析构函数
--第七章 继承与派生--派生类的构造和析构
-派生类成员的标识与访问
--虚基类
-第七章 继承与派生--派生类成员的标识与访问
-小结
--小结
-综合实例
--第七章综合实例
-实验七
--实验七
-导学
--导学
-第八章 多态性--导学
-运算符重载
--运算符重载的规则
-第八章 多态性--运算符重载
-虚函数
--虚函数
--虚析构函数
--虚表与动态绑定
-第八章 多态性--虚函数
-抽象类
--抽象类
--第八章 多态性--抽象类
-override与final
-第八章 多态性--override与final
-小结
--第八章小结
-综合实例
--第八章综合实例
-实验八
--实验八
- 第八章讲义
-导学
--导学
-模板
--函数模板
--类模板
-第九章 模板与群体数据--模板
-线性群体
--线性群体的概念
-第九章 模板与群体数据--线性群体
-数组
--数组类模板
-链表
--链表类模板
-第九章 模板与群体数据--链表
-栈
--栈类模板
--栈类模板课后习题
--例9-9 栈的应用课后习题
-队列
--队列类模板
-第九章 模板与群体数据--队列
-排序
--排序概述
--插入排序
--选择排序
--交换排序
-第九章 模板与群体数据--排序
-查找
--查找
--查找课后习题
-小结
--小结
-综合实例
--综合实例
-实验九
--实验九
- 第九章讲义
-导学
--导学
-泛型程序设计及STL的结构
--STL简介
-第十章 泛型程序设计与C++标准模板库--泛型程序设计及STL的结构
-迭代器
--迭代器
-第十章 泛型程序设计与C++标准模板库--迭代器
-容器的基本功能与分类
-第十章 泛型程序设计与C++标准模板库--容器的基本功能与分类
-顺序容器
--顺序容器的特征
--第十章 泛型程序设计与C++标准模板库--顺序容器
-关联容器
--集合
--映射
-第十章 泛型程序设计与C++标准模板库--关联容器
-函数对象
--函数对象
--函数适配器
-算法
--算法
-小结
--第十章小结
-综合实例
--综合实例
-实验十
--实验十
- 第十章讲义
-导学
--导学
-I/O流的概念及流类库结构
-第十一章 流类库与输入/输出--I/O流的概念及流类库结构
-输出流
--输出流概述
--向文本文件输出
--向二进制文件输出
--向字符串输出
-第十一章 流类库与输入/输出--输出流
-输入流
--输入流概述
--输入流应用举例
--从字符串输入
-第十一章 流类库与输入/输出--输入流
-输入/输出流
--输入/输出流
-第十一章 流类库与输入/输出--输入/输出流
-小结
--小结
-综合实例
--综合实例
-实验十一
--实验十一
- 第十一章讲义
-导学
--第12章导学
-异常处理的思想与程序实现
-第十二章 异常处理--异常处理的思想与程序实现
-异常处理中的构造与析构
-第十二章 异常处理--异常处理中的构造与析构
-标准程序库异常处理
-第十二章 异常处理--标准程序库异常处理
-小结
--第12章小结
-综合实例
--综合实例
-实验十二
--实验十二
- 第十二章讲义