SGI

函数对象

类别:仿函数 组件类型:概述

摘要

函数对象仿函数(这两个术语是同义词)仅仅是可以像函数一样被调用的任何对象。普通函数是函数对象,函数指针也是;更一般地,定义了operator().

的类的对象也是。

描述基本的函数对象概念是生成器一元函数二元函数:它们分别描述了可以像, f()f(x),以及f(x,y)

这样被调用的对象。(这个列表显然可以扩展到三元函数及更高阶,但在实践中,没有 STL 算法需要超过两个参数的函数对象。)STL 定义的所有其他函数对象概念都是这三种概念的细化。返回bool返回的函数对象是一个重要的特例。一元函数如果其返回值类型是返回,则称为谓词二元函数如果其返回值类型是

,则称为二元谓词operator()函数对象和可适配函数对象之间存在一个重要的区别,但这个区别有点微妙。[1] 一般来说,函数对象对其参数的类型有限制。尽管这些类型限制不必简单可能会被重载,或者可能是成员模板,或者两者都是。类似地,程序可能无法确定这些限制是什么。但是,可适配函数对象确实指定了参数和返回值类型,并提供嵌套的typedef以便在程序中命名和使用这些类型。如果类型F0可适配生成器的模型,则它必须定义F0::result_type。类似地,如果F1可适配一元函数的模型,则它必须定义F1::argument_typeF1::result_type,如果F2可适配二元函数的模型,则它必须定义, F2::first_argument_typef(x)F2::second_argument_typeF2::result_type。STL 提供了基类F1::argument_typeunary_functionbinary_function

来简化可适配一元函数可适配二元函数的定义。[2]可适配函数对象很重要,因为它们可以被函数对象适配器使用:转换或操作其他函数对象的函数对象。STL 提供了许多不同的函数对象适配器,包括unary_negate(它返回特定可适配谓词返回的值的逻辑补码),以及F1::argument_typeunary_composebinary_compose

,它们执行函数对象的组合。最后,STL 包含许多不同的预定义函数对象,包括算术运算(, plus, minus, multiplies, dividesf(x)modulusnegate),比较(, equal_to not_equal_to, greater, lessf(x)greater_equalless_equal),以及逻辑运算(, logical_andf(x)logical_orlogical_not

)。可以通过组合预定义函数对象和函数对象适配器来执行非常复杂的运算,而无需实际编写新的函数对象。

示例用随机数填充一个vector
    vector<int> V(100);
    generate(V.begin(), V.end(), rand);

。在这个例子中,函数对象只是一个函数指针。用随机数填充一个按大小对一个double

    struct less_mag : public binary_function<double, double, bool> {
	bool operator()(double x, double y) { return fabs(x) < fabs(y); }
    };

    vector<double> V;
    ...
    sort(V.begin(), V.end(), less_mag());

进行排序,忽略元素的符号。在这个例子中,函数对象是用户定义类的对象。用随机数填充一个查找一个

    struct adder : public unary_function<double, void>
    {
      adder() : sum(0) {}
      double sum;
      void operator()(double x) { sum += x; }
    };

    vector<double> V;
    ...
    adder result = for_each(V.begin(), V.end(), adder()); [3]
    cout << "The sum is " << result.sum << endl;

中元素的总和。在这个例子中,函数对象是用户定义的类,它具有局部状态。从一个list

    list<int> L;
    ...
    list<int>::iterator new_end = 
	 remove_if(L.begin(), L.end(),
		   compose2(logical_and<bool>(),
			    bind2nd(greater<int>(), 100),
			    bind2nd(less<int>(), 1000)));
    L.erase(new_end, L.end());

中删除所有大于 100 且小于 1000 的元素。

可适配二元谓词

pointer_to_binary_function

ptr_fun

注释

[1] “可适配函数对象”这个名称的原因是可适配函数对象可以被函数对象适配器使用。。STL 提供了基类F1::argument_typeunary_function[2]基类类似于, input_iterator, output_iterator, forward_iteratorf(x)bidirectional_iteratorrandom_access_iterator

基类:它们是完全空的,仅用于提供类型信息。[3] 这是一个如何使用函数对象的示例;这不是计算向量中元素总和的推荐方法。该accumulate

算法是计算总和的更好方法。


[Silicon Surf] [STL Home]
另请参阅 Copyright © 1999 Silicon Graphics, Inc. 保留所有权利。