首页 理论教育 c++STL标准模板库简明解析:仿函数概念

c++STL标准模板库简明解析:仿函数概念

时间:2023-10-25 理论教育 版权反馈
【摘要】:仿函数的优点表现在以下3个方面:1)仿函数比一般函数更灵活,主要是因为仿函数拥有状态。仿函数可以拥有两个状态不同的实体。仿函数的型别可以作为模板参数,用以实现指定某种行为的目的。3)仿函数要比函数指针的执行速度快得多。为提高效率,仿函数的形式被引入。仿函数均是以类似函数的形式被调用的。学习仿函数,首先要了解3个概念:生成器、一元函数和二元函数。此外,仿函数还有型别,即仿函数的返回值。

c++STL标准模板库简明解析:仿函数概念

通常可以这样理解,仿函数是一个定义了operator()的对象,可以将其视为一般函数。仿函数与一般函数的不同之处在于:仿函数的功能是在其成员operator()函数中实现的。虽然仿函数的定义形式比较复杂,但其同样具有一定的优点。仿函数的优点表现在以下3个方面:

1)仿函数比一般函数更灵活,主要是因为仿函数拥有状态。仿函数可以拥有两个状态不同的实体。而通常的普通函数是不具备该特点的。

2)每个仿函数都有其型别。仿函数的型别可以作为模板参数,用以实现指定某种行为的目的。容器型别不会和具体仿函数有关,而仅仅是该型别的仿函数均可使用。

3)仿函数要比函数指针的执行速度快得多。在C++标准中,调用函数通常使用指针,即当需要调用函数时,只需调用函数的地址(名称)即可。地址调用方法的缺陷是效率非常低。为提高效率,仿函数的形式被引入。定义的仿函数是通过使用运算符operator()被调用的。通过自定义运算符能显著提高效率。

仿函数均是以类似函数的形式被调用的。仿函数均包含成员operator()函数,这是仿函数的共同点。仿函数的基类是:

这两个基类用于为参数提供标准的名字及规定返回值类型,从而使程序员可以从这两个基类派生出相应的自己的类。

类unary_function是空的基类,类没有任何的成员函数和成员变量,仅包含型别信息。该基类是为了让自适应单元函数模型(Adaptable Unary Function Models)的定义更方便。自适应单元函数模型必须包含嵌套型别声明。继承unary_function是获得嵌套型别的“不二法门”。

同样,类binary_function也是一个空类,仅包含成员函数和成员变量以及型别信息。该类的存在使自适应双元函数模型(Adaptable Binay Function models)的定义更方便。同样,自适应双元函数模型也必须包含嵌套型别声明。继承基类binary_function是获得嵌套型别的“不二法门”。

以上两个基类均声明于头文件<functional>中。

学习仿函数,首先要了解3个概念:生成器、一元函数和二元函数。(www.xing528.com)

•生成器是不用参数就可以调用的仿函数,即无参数仿函数。

•一元函数是用一个参数就可以调用的仿函数。

•二元函数是用两个参数才可以调用的仿函数。

例如,对于算法for_each(),其调用的仿函数应该是一元函数。

上述概念还有其他说法:

•返回bool值的一元函数是Predicate(一元谓词)。

•返回bool值的二元函数是binary predicate(二元谓词)。

部分STL的函数需要一元参数或二元参数。例如,算法sort()需要使用二元函数作为其调用的仿函数。

此外,仿函数还有型别,即仿函数的返回值。无参数的仿函数具有一个返回型别;一元函数具有两个返回型别;二元函数具有3个返回型别。仿函数被定义为“类”,可以拥有嵌套型别。unary Function和binary Function两个类中仅仅具有一些类型声明。

STL还把仿函数和自适应仿函数区分开来。通常,一个仿函数会有一个参数型别与一个返回型别,程序并不知晓那些型别的具体名称。自适应仿函数会指明参数与返回型别为何会内含嵌套的类型定义,程序中指定并使用那些型别。若型别F1是自适应一元仿函数的模型,那么需要定义F1::argument_type和F1::result_type;若型别F2是自适应二元仿函数,那么需要定义F2::first_argument_type、F2::second_argument_type和F2::result_type。STL的两个基类unary_function(一元函数)和binary_function(二元函数),可以使定义自适应的一元和二元仿函数简便许多。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈