STL 函数对象

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值