STL函数对象使用
//函数对象
/*
函数对象就是一个行为类似函数的对象,为了能够行为类似函数,所以在类中必须自定义
函数调用运算子() 函数指针不够灵活 无法满足STL的抽象性要求
*/
/*
unary_function STL规定每一个一元函数都必须继它 它内部只模板化了参数与返回值
binary_function 呈现二元函数的两个参数与返回值 用户可以继承它
binder1st将某个二元仿函数 转为一元仿函数
内部将第一个参数与运算符 转化为保护成员 第二个参数成为函数参数
*/
/*
算数类运算符 plus minus multipies divides modules negate(否定)
关系类运算符 equal_to(=) not_equal_to grater greater_equal less less_equal
逻辑类运算符 logical_and/or/not
*/
#include<iostream>
#include<string>
#include<functional>
#include<vector>
#include<iterator>
#include<numeric>//accuulate
#include<algorithm>
using namespace std;
template<class T>
class Com :public binary_function<T, T,T>//两个参数和返回值
{
public:
T operator()(const T& val1, const T& val2)
{
if ((0 == val1 % 2 && 0 == val2 % 2) ||(0 != val1 % 2 && 0 != val2 % 2))
{
return val1 < val2;
}
else if (0 == val1 % 2 && 0 != val2 % 2)
{
return true;
}
else
{
return false;
}
}
};
//由于类模板有两个参数 返回值不同时 最好都写出来 比如本例中的int 和bool
//不过可以默认模板参数
template<class T=int,class T1=bool>
class Unary :public unary_function<T, T1>//参数和返回值
{
public:
bool operator() (const T& val)
{
return 0 == val % 2;
}
};
template<class T>
void Display(const vector<T>& vec)
{
copy(vec.begin(), vec.end(), ostream_iterator<T>(cout, " "));
puts("");
}
int main(void)
{
int a[] = { 8,9,-7,12,4,36,120,5,1,2,3 };
int len = sizeof(a) / sizeof(a[0]);
vector<int> vec(a, a + len);
//sort(vec.begin(), vec.end(), Com<int>());
Display<int>(vec);
//2 4 8 12 36 120 -7 1 3 5 9 偶数排在奇数前 并且递增
partition(vec.begin(),vec.end(), Unary<int>());
//偶数在奇数前面 顺序无关
//8 2 120 12 4 36 -7 5 1 9 3
Display<int>(vec);
cout<<accumulate(vec.begin(),vec.end(),1,multiplies<int>())<<endl;
//1159684096
//1 为证同元素 累乘
return 0;
}