FunctionObject_函数对象

函数对象: (主要用途是用来搭配STL算法)


(1)函数对象:是一个重载了operator()的对象。

例如:

class FunctionObjectType

{

void operator() ()

{

statements;

}

}

这样定义的优势:

*函数对象比一般函数更灵巧,因为它可以拥有状态

*每个函数对象都有其型别。

*执行速度上,函数对象比函数指针快些


(2)函数对象的分类(以功能划分,定义于stl_function.h中)

1.算术类仿函数

*加法:plus<T>

*减法:minus<T>

*乘法:multiplies<T>

*除法:divides<T>

*模取:modulus<T>

*否定:negate<T>


2. 关系运算类仿函数:

*等于:equal_to<T>

*不等于:not_equal_to<T>

*大于:greater<T>

*大于或等于:greater_equal<T>

*小于:less<T>

*小于或等于:less_equal<T>


3. 逻辑运算类

*逻辑运算and :logical_and<T>

*逻辑运算or :logical_or<T>

*逻辑运算not :logical_not<T>



实例代码


#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

/*
Function object定义:
    Function object是一个对象,不过它的行为表现像函数。一般而言,它是由一个重载了operator()的类所实例化得来的对象。
	函数对象就是一个重载了()运算符的对象,它可以像一个函数一样使用。
*/

template<typename T>
class Pred
{
    private:
        T _val;
    public:
        Pred(T val):_val(val){}

        bool operator()(T val) //FunctionObject类一定要重载operator"()"
		{
            return val>_val;
        }
};

void Test_Pred()
{
	vector<int> iVec;
	for(int i = 0; i < 100; i++)
	{
		iVec.push_back(i);
	}
	
	int count = count_if(iVec.begin(), iVec.end(), Pred<int>(50));
}

template <class T> 
class AddValue { 
  private: 
    T theValue;       

  public: 
	AddValue(T v) : theValue(v) { } 

	void operator() (T& elem) const //FunctionObject类一定要重载operator"()"
	{ 
		elem += theValue; 
	}
};

void Test_AddValue()
{
	vector<int> iVec;
	for(int i = 0; i < 10; i++)
	{
		iVec.push_back(i);
	}

	for_each(iVec.begin(), iVec.end(), AddValue<int>(10));
}

int main(int argc, char* argv[])
{
	Test_Pred();
	Test_AddValue();

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值