1、函数对象——重载了()操作符的类
class SumAdd
{
public:
void operator() () //这里两个括号看起来很怪,第一个是表示重载()操作符,第二个表示使用时()中写几个参数和参数的类型,这里没有写参数
{
}
};
2 、一元函数对象和二元函数对象
一元函数对象表示一个参数的函数对象(在类中重载()操作符时规定了一个参数),同理,二元函数对象就是两个参数的函数对象
//一元函数对象
class SumAdd
{
public:
void operator() (int a)
{
...
}
};
//二元函数对象
class SumAdd
{
public:
void operator() (int a,int b)
{
...
}
};
那么有没有三元函数对象呢,按照这个规定,只要重载函数操作符时规定三个参数即可
3、函数对象的使用方法
当了解到函数对象怎么用市其实也很简单,定义一个重载了()的类的对象,然后直接使用()就行,就像用其他操作符一样(比如+ -等等)
具体例子
class myadd
{
public:
int operator() (int &add1 , int &add2 ,int &add3)
{
return add1 + add2 + add3;
}
};
int main(void)
{
myadd myadd; //用类定义一个对象
int a = 6;
int b = 8;
int c = 8;
int temp = myadd(a, b ,c); //直接用()即可
cout << "add:"<<temp << endl;
cout << endl;
system("pause")
}
4、伪函数
由上面例子可见,在重载了()操作符的对象使用()是,很像是在调用一个函数,所以函数对象也叫做伪函数,自己理解这个伪没有什么特殊的含义,就是指调用的样子和调用函数很像而已
5 、涉及函数对象的几个STL 算法
1、for_each()
class mycount
{
public:
void operator()(int &count1)
{
n++;
cout <<"void operator()(int &count1) n:"<< n << endl;
}
void printf_count()
{
cout << n << endl;
}
public:
int n;
};
int main(void)
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
mycount mycount;
for_each(v1.begin(), v1.end(), mycount); //匿名函数对象 匿名仿函数
cout << "mycount.n:"<<mycount.n << endl;//输出0
cout << "printf_count:";
mycount.printf_count();//输出0
mycount = for_each(v1.begin(), v1.end(), mycount); //匿名函数对象 匿名仿函数
cout << "2mycount.n:" << mycount.n << endl;//输出3
cout << "2printf_count:";
mycount.printf_count();//输出3
//for_each算法的 函数对象的传递 是元素值传递 ,不是引用传递
/*
template<class _InIt,
class _Fn1> inline
_Fn1 for_each(_InIt _First, _InIt _Last, _Fn1 _Func)
{ // perform function for each element
_DEBUG_RANGE(_First, _Last);
_DEBUG_POINTER(_Func);
return (_For_each(_Unchecked(_First), _Unchecked(_Last), _Func));
}
*/
//分清楚 stl算法返回的值是迭代器 还是 谓词(函数对象)
cout << endl;
system("pause");
因为for_each()中函数对象的传递是值传递而不是引用传递,所以在传递的时候会为形参创建副本,所以改变的知识副本而已,要是想改变实参,就要知道函数返回的是什么,像for_each()返回的是一个对象,所以我们只要用原对象去接就行了
2、find_if()
class IsDiv
{
public:
IsDiv(const int &divisor)
{
this->divisor = divisor;
}
bool operator()(int &t)
{
return (t%divisor == 0);
}
private:
int divisor;
};
int main(void)
{
vector<int> v2;
for (int i = 10; i<33; i++)
{
v2.push_back(i);
}
int a = 4;
IsDiv myDiv(a);
vector<int>::iterator it;
it = find_if(v2.begin(), v2.end(), IsDiv(a));
if (it == v2.end())
{
cout << "容器中没有被4整除的元素" << endl;
}
else
{
cout << "第一个是被4整除的元素是:" << *it << endl;
}
}
find_if()函数返回的则是一个迭代器,所以才说;
!!!分清楚 stl算法返回的值是迭代器 还是 谓词(函数对象)