8、泛型程序设计与c++标准模板库5.函数对象
1、函数对象
函数对象是STL提供的第四类主要组件,它使得STL的应用更加灵活方便,从而增强了算法的通用性。大多数STL算法可以用一个函数对象作为参数。所谓“函数对象”其实就是一个行为类似函数的对象,它可以不需要参数,也可以带有若干参数,其功能是获取一个值,或者改变操作的状态。
在c++程序设计中,任何普通的函数和任何重载了调用运算符operator()的类的对象都满足函数对象的特征,因此都可以作为函数对象传递给算法作为参数使用。
以数值算法accumulate()为例子,介绍函数对象的设计及应用过程。
数值算法accumulate()的调用格式包括两种:第一种调用格式是以"+"运算符作为运算规则,第二种算法允许用户铜鼓哦传递给算法相应的函数对象来指定计算规则。
一般来说,用户设计的普通函数就是一种最简单的函数对象,
例子1:利用普通函数来定义函数对象
#include<iostream>
#include<numeric> //包含数值算法头文件
using namespace std;
int mutl(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, mutl);
getchar();
cout<<endl;//将普通函数mutl传递给通用算法
}
除了普通函数,另一类函数对象可以是类的对象,并且在定义中重载函数调用运算符。
例子2:改写上面的程序
#include<iostream>
#include<numeric> //包含数值算法头文件
using namespace std;
class multclass //定义multclass类
{ public:
int operator()( int x, int y )const{return x*y; }//重载操作符operator()
};
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传递给通用算法
getchar();
cout << endl;//将普通函数mutl传递给通用算法
}
分析:通过在类multclass中重载运算符operator(),就定义了一种可以作为函数参数的对象,同样可以像使用普通函数mutl一样来使用该对象。但是这里传递给算法accumulate的对象是通过multclass类的默认构造函数multclass()获得的,它可以由编译器自动提供。使用类的形式定义的函数对象能够比普通函数携带更多的额外信息。
除了上面之外,STL中也定义了一些标准的函数对象,如果以功能划分,可以分为算数运算、关系运算、逻辑运算三大类。为了调用这些标准函数对象,需要包含头文件<functional>。标准函数对象是内连函数。
2、函数适配器
与前面介绍过的迭代器适配器的作用类似,函数适配器也可以帮助创建种类更多的函数对象。与直接铜鼓哦结构或类定义来创建新的函数对象相比,使用函数适配器是一种更加容易的方式。
8、泛型程序设计与c++标准模板库5.函数对象的更多相关文章
- 8、泛型程序设计与c++标准模板库1、泛型程序设计的概念和术语
有效地利用已有的成果,将经典的.优秀的算法标准化.模块化,从而提高软件的生产率,是软件产业化的需求,为了实现这一需求,不仅需要面向对象设计思想,而且需要泛型程序设计思想. c++语言提供的标准模板库( ...
- 8、泛型程序设计与c++标准模板库4.标准c++库中的算法
标准c++算法是通过迭代器和模板来实现的,其实算法本身就是一种函数模板. 算法从迭代器那里获得一个元素,而迭代器则知道一个元素在容器中的什么位置.迭代器查找元素的位置并将这些信息提供给算法以便算法能够 ...
- 8、泛型程序设计与c++标准模板库2、c++标准模板库中的容器
顺序容器类以逻辑线性排列方式存储元素,在这些容器类型中的元素在逻辑上被认为是连续的存储空间中存储的.顺序容器可用于存储线性群体. 在关联容器类中,元素的存储和检索基于关键字和元素与其他元素之间的关系, ...
- C++学习笔记53:泛型程序设计与C++标准模板库
泛型程序设计的基本概念 编写不依赖于具体数据类型的程序 将算法从特定的数据结构中抽象出来,成为通用的 C++模板为泛型编程程序设计奠定了关键的基础 模型:符合一个概念的数据类型称为该概念的模型,例如: ...
- 8、泛型程序设计与c++标准模板库2.5容器适配器
容器适配器是用来扩展7中基本容器的,是修改和调整其他类接口的类.他们不提供存放数据的实际数据结构的实现方法,而且容器适配器也不支持迭代器. 1.标准栈容器 使用STL中的标准栈为程序员提供了一层附加的 ...
- 8、泛型程序设计与c++标准模板库3.迭代器
理解迭代器对于理解STL框架并掌握STL的使用至关重要.简单地说,迭代器是面向对象版本的指针,STL算法利用迭代器对存储在容器中的元素序列进行遍历,迭代器提供了访问容器和序列中每个元素的方法. 虽然指 ...
- 8、泛型程序设计与c++标准模板库2.3双端队列容器
双端队列容器是一种放松了访问权限的队列.除了从队列的首部和尾部访问元素外,标准的双端队列也支持通过使用下标操作符"[]"进行直接访问. 它提供了直接访问和顺序访问方法.其头文件为& ...
- 8、泛型程序设计与c++标准模板库2.2向量容器
向量容器属于顺序容器,用于容纳不定长线性序列(即线性群体),提供对序列的快速随机访问(也称直接访问).这一点与c++语言支持的基本数组类型相同,但基本数据类型不是面向对象的.而面向对象的向量是动态结构 ...
- 第十章 泛型程序设计与C++标准模板库 泛型程序设计及STL的结构
随机推荐
- python 3 mysql 索引原理与慢查询优化
python 3 mysql 索引原理与慢查询优化 一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最 ...
- origin与referer的区别
referer显示来源页面的完整地址,而origin显示来源页面的origin: protocal+host,不包含路径等信息,也就不会包含含有用户信息的敏感内容 referer存在于所有请求,而or ...
- vim 的visual可视模式
一,在普通模式下面可以按v或者V进入可视模式下,选择内容: v 可以选择光标位置到光标结束的字符,包括行: V 选择光标位置行到光标结束的所在行的之间的所有行,选择的是个矩形: CTRL+v 选择块:
- ML2 Extension Manager
The extension manager for ML2 was introduced in Juno (more details can be found in the approvedspec) ...
- php: +1天, +3个月, strtotime(): +1 day, +3 month
php: +1天, +3个月, strtotime(): +1 day, +3 month 比如,我现在当前时间基础上+1天: strtotime("+1 day"); 比如我现 ...
- KVM-快照管理
1.kvm克隆 kvm 虚拟机有两部分组成:img镜像文件和xml配置文件(/etc/libvirt/qemu 克隆命令:virt-clone -o rhel6- 71 -n xuegod63-kvm ...
- (转)C协程实现的效率对比
前段时间实现的C协程依赖栈传递参数,在开启优化时会导致错误,于是实现了一个ucontext的版本,但ucontext的切换效率太差了, 在我的机器上执行4000W次切换需要11秒左右,这达不到我的要求 ...
- OpenCV——饱和度调整
参考: 闲人阿发伯的博客 // define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED ...
- Gym - 100513K :Treeland (按距离还原一棵树)
题意:一个顶点数为N的生成树,对于每个点i,我们按照与i的距离给出顺序,即dis i 1<=dis i 2<=dis i 3<=...,现在让你输出N-1条边,即还原这棵树. 思路: ...
- javascript获取窗口位置、绝对位置、事件位置等
有段时间没更新博客了,工作实在太忙了,加班加班再加班就是我们这个行业的常态吧...还好最近把工作进度完成了,终于有些空余时间了.关于<Javascript高级程序设计>系列,我并没有弃坑, ...