函数对象
算法的头文件
#include<algorithm>
//功能:比较、交换、查找、遍历、复制、修改、反转、排序、合并等
#include<numeric>
//数学运算(加法和乘法序列上的一些操作)
#include<functional>
//定义了模板类,用于声明函数对象
函数对象,重载了()操作符的类定义的对象,又叫仿函数。
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
//函数对象,类重载了()
template<typename T>
class ShowElim
{
public:
ShowElim()
{
n = 0;
}
void Printf()
{
cout << "n" << n << endl;
}
void operator()(T &a) //重载()操作符
{
n++;
cout <<"n="<< n << endl;
cout << a << endl;
}
private:
int n;
};
//函数对象和普通函数的区别
//普通函数
template<typename T>
void funShowElim(T &a)
{
cout << a << endl;
}
void funShowElim2(int &a)
{
cout << a << endl;
}
void main01()
{
int a = 10;
ShowElim<int> showelim;
showelim(a);//函数对象的()的执行 很像一个函数 ---仿函数
funShowElim<int>(a);
}
main01的执行结果:
//函数对象属于类对象,能突破函数的概念,能保持调用状态信息
//函数对象的好处
void main02()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
//用for_each()来遍历
for_each(v1.begin(), v1.end(), ShowElim<int>());//匿名函数对象 匿名仿函数
cout << endl;
for_each(v1.begin(), v1.end(), funShowElim2);//通过回调函数 谁使用for_each谁填写回调函数的入口地址
ShowElim<int> s2;
----------
//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);
// _For_each(_Unchecked(_First), _Unchecked(_Last), _Func);
// return (_STD move(_Func));
----------
s2=for_each(v1.begin(), v1.end(), s2);
//这里设计形参和实参的问题,所以要用s2来接返回值。
cout << endl;
s2.Printf();
}
main02的执行结果: