函数对象

今天思来想去,去了健身房锻炼了半个小时,然后吃了一碗米线。后来,想想今天是不是应该看看书呢,于是乎,来到公司看了看函数对象这块知识。

概念:

  所谓函数对象其实是一个行为类似函数的对象,它可以不需要参数,也可以带有若干参数,其功能就是获取一个值,或者改变操作的状态。在C++程序设计中,任何普通的函数和任何重载了调用运算符operator()的类的对象都满足函数对象的特征,因此都可以作为函数对象传递给算法作为参数使用。

分类:

  常用的函数对象可以分为产生器(generator),一元函数(unary function),二元函数(binary function),一元谓词(unary predicate),二元谓词(binary prediciate)

下面给出两个例子:

1.第一个例子用普通的函数作为函数对象

//定义一个普通函数

int mult(int x, int y){return x*y;};

int array[] = {1, 2, 3, 4, 5};
const int N = sizeof(array)/sizeof(int);
cout << "the result:"<<accumulate(array, array+N,1,mult)<<endl;

 

2.重载了函数调用符的类作为函数对象

class MultClass
{
public:
int operator()(int x, int y)const{return x*y;}//重载操作符operator()
};

int array[] = {1, 2, 3, 4, 5};
const int N = sizeof(array)/sizeof(int);
cout << "MultClass accumulate result is"<<accumulate(array, array + N, 1, MultClass());
View Code

 

说一下函数适配器:

STL中定义了大量的函数对象,但是有时候需要函数返回值需要进一步简单计算,或者填上多余的参数,不能直接带入算法。函数适配器实现了这一功能,将一种函数对象转化为另一种符合要求的函数对象。

函数适配器可以分为4大类:

1.绑定适配器

2.组合适配器

3.指针函数适配器

4.成员函数适配器

给一个关于绑定适配器的例子:

//STL函数适配器,在数组中查找第一个大于40的元素
/////////////////////////////////////////////////////////

int intArr[] = {30, 90, 10, 40, 70, 50, 20, 80};
const int NArr = sizeof(intArr)/sizeof(int);
vector<int> arr(intArr, intArr + NArr);
vector<int>::iterator p = find_if(arr.begin(), arr.end(), bind2nd(greater<int>(), 40));
if (p == arr.end())
{
cout<<"no element greater than 40"<<endl;
}
else
{
cout<<"first element greater than 40 is:" << *p<<endl;
}
View Code

 


//////////////////////////////////////////////////////////

今天就说这么多,后续会继续研究这块滴~

posted @ 2016-10-19 22:00  布丁乌托邦颖  阅读(180)  评论(0)    收藏  举报