#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<set>
#include<algorithm>
#include<functional>
using namespace std;
template<typename T>
class ShowElemt
{
public:
ShowElemt()
{
n = 0;
}
void operator()(T&t)
{
n++;
// printN();
cout << t <<" ";
}
void printN()
{
cout << "n:" << n << " ";
}
private:
int n;
};
//模板函数
template<typename T>
void FunShowElemt(T &t)
{
cout << "FunShowElemt:" << t << " ";
}
//普通函数
void FunShowElemt2(int &t)
{
cout << "FunShowElemt2:" << t << " ";
}
void main01()
{
int a = 10;
ShowElemt<int> showElemt;
showElemt(a);//函数对象的执行很像一个函数 伪函数
FunShowElemt<int>(a);
FunShowElemt2(a);
}
//函数对象是属于类对象,能突破函数概念,能保持调用状态信息
//for_each算法中 函数对象做函数参数
//for_each算法中 函数对象当返回值
void main02()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
for_each(v1.begin(), v1.end(), ShowElemt<int>());
cout << endl;
for_each(v1.begin(), v1.end(), FunShowElemt2);
cout << endl;
ShowElemt<int> show1;
/*
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));
}
*/
//for_each算法的函数 对象的传递 是元素值传递,不是引用传递
for_each(v1.begin(), v1.end(), show1);
show1.printN();
cout << endl;
show1 = for_each(v1.begin(), v1.end(), show1);//通过for_each算法的返回值看调用的次数
show1.printN();
//结论要点:分清楚 stl算法返回的值是迭代器还是谓词(函数对象)是stl算法入门的重要点
}
STL函数对象当参数和返回值
最新推荐文章于 2023-06-17 01:32:04 发布