FunctionObject_函数对象

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


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

例如:

class FunctionObjectType

{

void operator() ()

{

statements;

}

}

这样定义的优势:

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

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

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


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

1.算术类仿函数

*加法:plus

*减法:minus

*乘法:multiplies

*除法:divides

*模取:modulus

*否定:negate


2. 关系运算类仿函数:

*等于:equal_to

*不等于:not_equal_to

*大于:greater

*大于或等于:greater_equal

*小于:less

*小于或等于:less_equal


3. 逻辑运算类

*逻辑运算and :logical_and

*逻辑运算or :logical_or

*逻辑运算not :logical_not



实例代码


#include 
#include 
#include 
using namespace std;

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

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

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

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

template  
class AddValue { 
  private: 
    T theValue;       

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

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

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

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

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

	return 0;
}

你可能感兴趣的:(C++编程)