C++标准库---仿函数

概念
        仿函数(functor),就是使一个类的使用看上去象一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。
  有些功能的的代码,会在不同的成员函数中用到,想复用这些代码。


                            1)公共的函数,可以,这是一个解决方法,不过函数用到的一些变量,就可能成为公共的全局变量,再说为了复用这么一片代码,就要单立出一个函数,也不是很好维护。

                            2)仿函数,写一个简单类,除了那些维护一个类的成员函数外,就只是实现一个operator(),在类实例化时,就将要用的,非参数的元素传入类中。


使用一般函数:

#include
#include
#include
#include

using namespace std;

template
inline void PRINT_ELEMENTS(const T& coll,const char * optcstr="")
{
	typename T::const_iterator pos;
	cout<
void add(int &elem)
{
	elem+=theValue;
}

int main()
{
	vector coll1;
	vector coll2;

	for(int i=1;i<=9;i++)
	{
		coll1.push_back(i);
	}
	PRINT_ELEMENTS(coll1,"initialized: ");

	for_each(coll1.begin(),coll1.end(),add<10>);

	PRINT_ELEMENTS(coll1,"after adding 10: ");

	transform(coll1.begin(),coll1.end(),back_inserter(coll2),square);

	PRINT_ELEMENTS(coll2,"squared: ");

	system("pause");
	return 0;
}

使用仿函数:

//仿函数
#include
#include
#include

using namespace std;

template
inline void PRINT_ELEMENTS(const T& coll,const char * optcstr="")
{
	typename T::const_iterator pos;
	cout< coll;

	for(int i=1;i<=9;i++)
	{
		coll.push_back(i);
	}

	PRINT_ELEMENTS(coll,"initialized: ");

	for_each(coll.begin(),coll.end(),AddValue(10));

	PRINT_ELEMENTS(coll,"after adding 10: ");

	for_each(coll.begin(),coll.end(),AddValue(*coll.begin()));

	PRINT_ELEMENTS(coll,"after adding first element: ");

	system("pause");
	return 0;
}

凡是行为像函数,那么这个对象就是函数。仿函数就是这个意思,但是STL中为什么要用仿函数而不直接用函数呢?

首先STL是一个有自己规则的框架,函数指针无法和STL其他组件搭配(配接器),产生更灵活的变化:

仿函数应当有能力被函数配接器修饰,然后彼此合作形成一个整体。为了可配接仿函数需要定义自己的相应型别(和迭代器的型别的作用是一个含义)。由于STL只使用一元和二元仿函数,所以定义了两个class:unaru_function和binary_function。这两个类没有成员,只有一些型别定义。任何仿函数,只要依个人需求选择继承其中一个class,便自动拥有了那些相应型别,也就自动拥有了配接能力。

其次仿函数相对于函数指针有其自身优点:

1、 仿函数是智能型函数

就好比智能指针的行为像指针,其就可看作是一个指针。但是智能指针是定义的一个类对象,所以在具备指针功能的同时也有其他的能力。仿函数的能力也可以超越operator()。因为仿函数可以拥有成员函数和成员变量,这意味着仿函数拥有状态。另一个好处是可以在执行期初始化它们。

2、 仿函数都有自己的型别

这就是泛型编程编写仿函数。

3、 仿函数通常比一般函数快

就template的概念而言,由于更多细节在编译器就已确定,所以通常可能进行更好的最佳化。


你可能感兴趣的:(C++标准库,标准库,仿函数)