当前课程知识点:C++语言程序设计进阶 >  第十章 泛型程序设计与C++标准模板库 >  函数对象 >  函数对象

返回《C++语言程序设计进阶》慕课在线视频课程列表

函数对象在线视频

函数对象

函数对象

函数对象概念图

10-6.png

例10-13、例10-14:

例10-13

#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

//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;
}

STL提供的函数对象

例10-15 利用STL标准函数对象

//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利用STL中的二元谓词函数对象

// 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++语言程序设计进阶》慕课在线视频列表

函数对象课程教案、知识点、字幕

大家好

欢迎回来继续学习

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最后的排序结果

是按照由大到小的次序进行排序

那我们可以看到

这是排序以后的输出结果

这是排序以前的情况

C++语言程序设计进阶课程列表:

第七章 继承与派生

-导学

--导学

-继承的基本概念和语法

--继承的基本概念和语法

-第七章 继承与派生--继承的基本概念和语法习题

-继承方式

--继承方式简介及公有继承

--私有继承和保护继承

-第七章 继承与派生--继承方式

-基类与派生类类型转换

--基类与派生类类型转换

-第七章 继承与派生--基类与派生类类型转换

-派生类的构造和析构

--派生类的构造函数

--派生类的构造函数举例

--派生类的复制构造函数

--派生类的析构函数

--第七章 继承与派生--派生类的构造和析构

-派生类成员的标识与访问

--访问从基类继承的成员

--虚基类

-第七章 继承与派生--派生类成员的标识与访问

-小结

--小结

-综合实例

--第七章综合实例

-实验七

--实验七

-第七章讲义

第八章 多态性

-导学

--导学

-第八章 多态性--导学

-运算符重载

--运算符重载的规则

--双目运算符重载为成员函数

--单目运算符重载为成员函数

--运算符重载为非成员函数

-第八章 多态性--运算符重载

-虚函数

--虚函数

--虚析构函数

--虚表与动态绑定

-第八章 多态性--虚函数

-抽象类

--抽象类

--第八章 多态性--抽象类

-override与final

--override与final

-第八章 多态性--override与final

-小结

--第八章小结

-综合实例

--第八章综合实例

-实验八

--实验八

- 第八章讲义

第九章 模板与群体数据

-导学

--导学

-模板

--函数模板

--类模板

-第九章 模板与群体数据--模板

-线性群体

--线性群体的概念

-第九章 模板与群体数据--线性群体

-数组

--数组类模板

--例9-4数组类应用举例

-链表

--链表的概念与结点类模板

--链表类模板

-第九章 模板与群体数据--链表

-栈

--栈类模板

--栈类模板课后习题

--例9-9 栈的应用

--例9-9 栈的应用课后习题

-队列

--队列类模板

-第九章 模板与群体数据--队列

-排序

--排序概述

--插入排序

--选择排序

--交换排序

-第九章 模板与群体数据--排序

-查找

--查找

--查找课后习题

-小结

--小结

-综合实例

--综合实例

-实验九

--实验九

- 第九章讲义

第十章 泛型程序设计与C++标准模板库

-导学

--导学

-泛型程序设计及STL的结构

--泛型程序设计的基本概念

--STL简介

-第十章 泛型程序设计与C++标准模板库--泛型程序设计及STL的结构

-迭代器

--迭代器

-第十章 泛型程序设计与C++标准模板库--迭代器

-容器的基本功能与分类

--容器的基本功能与分类

-第十章 泛型程序设计与C++标准模板库--容器的基本功能与分类

-顺序容器

--顺序容器的基本功能

--顺序容器的特征

--顺序容器的插入迭代器与适配器

--第十章 泛型程序设计与C++标准模板库--顺序容器

-关联容器

--关联容器分类和基本功能

--集合

--映射

--多重集合和多重映射

-第十章 泛型程序设计与C++标准模板库--关联容器

-函数对象

--函数对象

--函数适配器

-算法

--算法

-小结

--第十章小结

-综合实例

--综合实例

-实验十

--实验十

- 第十章讲义

第十一章 流类库与输入/输出

-导学

--导学

-I/O流的概念及流类库结构

--I/O流的概念及流类库结构

-第十一章 流类库与输入/输出--I/O流的概念及流类库结构

-输出流

--输出流概述

--向文本文件输出

--向二进制文件输出

--向字符串输出

-第十一章 流类库与输入/输出--输出流

-输入流

--输入流概述

--输入流应用举例

--从字符串输入

-第十一章 流类库与输入/输出--输入流

-输入/输出流

--输入/输出流

-第十一章 流类库与输入/输出--输入/输出流

-小结

--小结

-综合实例

--综合实例

-实验十一

--实验十一

- 第十一章讲义

第十二章 异常处理

-导学

--第12章导学

-异常处理的思想与程序实现

--异常处理的思想与程序实现

-第十二章 异常处理--异常处理的思想与程序实现

-异常处理中的构造与析构

--异常处理中的构造与析构

-第十二章 异常处理--异常处理中的构造与析构

-标准程序库异常处理

--标准程序库异常处理

-第十二章 异常处理--标准程序库异常处理

-小结

--第12章小结

-综合实例

--综合实例

-实验十二

--实验十二

- 第十二章讲义

函数对象笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。