#include <iostream>
#include <deque>
#include <vector>
#include <algorithm>
#include <functional>
#include <string>
#include <sstream>
#include <iostream>
#include <list>
using namespace std;
void print(int &t)
{
std::cout<< t << " ";
}
template<class T>
class less1 //判断是否小
{
public:
less1()
{
}
T operator()(T &x1,T &x2)
{
return (x1 < x2)? 0:1;
}
};
template<class T>
class less2 //判断是否大
{
public:
less2()
{
}
T operator()(T &x1,T &x2)
{
return (x1 > x2)? 0:1;
}
operator double()
{
return static_cast<double>(sum_D);
}
private:
long sum_D;
};
class SUM//有返回值的仿函数
{
private:
long sum_D;
public:
SUM() :sum_D(0)
{
}
void operator()(int elem)
{
sum_D += elem;
}
operator double()
{
return static_cast<double>(sum_D);
}
};
template <class T>//没有返回值得仿函数
class Multiple
{
private:
T thevalue;
public:
Multiple(const T &v) :thevalue(v)
{
}
void operator()(T &elem)const
{
elem *= thevalue;
}
};
/*
//for_each 在库中的实现
template<class _InIt,
class _Fn> inline
_Fn for_each(_InIt _First, _InIt _Last, _Fn _Func)
{ // perform function for each element [_First, _Last)
_DEBUG_RANGE(_First, _Last);
auto _UFirst = _Unchecked(_First);
const auto _ULast = _Unchecked(_Last);
for (; _UFirst != _ULast; ++_UFirst)
{
_Func(*_UFirst);
}
return (_Func);
}
*/
int main()
{
vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
vec.push_back(5);
vec.push_back(6);
for_each(vec.begin(), vec.end(), print);
cout << endl;
for_each(vec.begin(), vec.end(), Multiple<int>(2));
for_each(vec.begin(), vec.end(), print);
cout << endl;
double sum = for_each(vec.begin(), vec.end(), SUM());//有返回值的仿函数
sort(vec.begin(),vec.end(),less<int>());
for_each(vec.begin(), vec.end(), print);
cout<<endl<<"使用自己定义less防函数"<<endl;
sort(vec.begin(),vec.end(),less1<int>());
for_each(vec.begin(), vec.end(), print);
cout<<endl;
sort(vec.begin(),vec.end(),less2<int>());
for_each(vec.begin(), vec.end(), print);
cout<<endl<<"使用自己定义less防函数 结束"<<endl;
cout << sum;
return 0;
}