仿函数为何物?

仿函数是什么

仿函数又称函数对象,其本质是类的对象,但为什么带“函数”二字呢,因为该类重载了()运算符,使得对象使用()时类似使用函数。

如:

greater<int> ig;			

//比较大小。greater<int>是一个模板类,ig是该类的对象,这里称ig为仿函数或函数对象。

cout << ig(5, 2) << endl;	

//之所以称呼ig时带“函数”二字,是因为ig使用()操作符时类似函数调用的形式。

 


 

仿函数用在哪里

STL的算法一般都提供了两个版本,一个是最直观的,一个是要用户提供某种策略的,而仿函数正是为了提供策略。

如:

cout << accumulate(ivec.begin(), ivec.end(), 0) << endl;

	//15, i.e. 0 + 1 + 2 + 3 + 4 + 5

	//第一个版本,默认是元素相加。



cout << accumulate(ivec.begin(), ivec.end(), 0, minus<int>()) << endl;

	//-15, i.e. 0 - 1 - 2 - 3 - 4 - 5

	//第二个版本,minus<int>()产生了一个对象(即仿函数/函数对象)用来提供策略(这里是元素相减).



 

	//accumulate第一个版本。

	template <class InputIterator, class T>

	T accumulate(InputIterator first, InputIterator last, T init, BinaryOperation binary_op)

	{

		for ( ; first != last; ++first)

		{

			init = init + *first;

		}

		return init;

	}



	//accumulate第二个版本。

	template <class InputIterator, class T, class BinaryOperation>

	T accumulate(InputIterator first, InputIterator last, T init, BinaryOperation binary_op)

	{

		for ( ; first != last; ++first)

		{

			init = binary_op(init, *first);//binary_op不是函数,而是一个对象,它调用()操作。

		}

		return init;

	}


 

你可能感兴趣的:(函数)