用多态实现for_each算法
#include<iostream>
#include<vector>
using namespace std;
class Fun
{
public:
virtual void dosomething(int n) = 0;
};
class Printf:public Fun
{
public:
virtual void dosomething(int n)
{
cout<<n<<endl;
}
};
class FindMax:public Fun
{
public:
FindMax():max_(0){}
virtual void dosomething(int n)
{
max_ = max(n,max_);
}
void GetMax()const
{
cout<<max_<<endl;
}
private:
int max_;
};
void foreach(vector<int>::iterator first,vector<int>::iterator last,Fun& fun)
{
for(vector<int>::iterator it = first;it!=last;it++)
{
fun.dosomething(*it);
}
}
int main()
{
vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
Printf p;
foreach(vec.begin(),vec.end(),p);
FindMax f;
foreach(vec.begin(),vec.end(),f);
f.GetMax();
return 0;
}
优化用仿函数和函数模版来实现for_each算法
#include<iostream>
#include<vector>
using namespace std;
class Printf
{
public:
virtual void operator()(int n)
{
cout<<n<<endl;
}
};
class FindMax
{
public:
FindMax():max_(0){}
virtual void operator()(int n)
{
max_ = max(n,max_);
}
void GetMax()const
{
cout<<max_<<endl;
}
private:
int max_;
};
template <typename iterator,typename Fun>
void foreach(iterator first,iterator last,Fun& fun)
{
for(iterator it = first;it!=last;it++)
{
fun(*it);
}
}
int main()
{
vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
Printf p;
foreach(vec.begin(),vec.end(),p);
FindMax f;
foreach(vec.begin(),vec.end(),f);
f.GetMax();
return 0;
}