类别:仿函数 | 组件类型:概述 |
这样被调用的对象。(这个列表显然可以扩展到三元函数及更高阶,但在实践中,没有 STL 算法需要超过两个参数的函数对象。)STL 定义的所有其他函数对象概念都是这三种概念的细化。返回bool返回的函数对象是一个重要的特例。一元函数如果其返回值类型是返回,则称为谓词,二元函数如果其返回值类型是
,则称为二元谓词。operator()函数对象和可适配函数对象之间存在一个重要的区别,但这个区别有点微妙。[1] 一般来说,函数对象对其参数的类型有限制。尽管这些类型限制不必简单可能会被重载,或者可能是成员模板,或者两者都是。类似地,程序可能无法确定这些限制是什么。但是,可适配函数对象确实指定了参数和返回值类型,并提供嵌套的typedef以便在程序中命名和使用这些类型。如果类型F0是可适配生成器的模型,则它必须定义F0::result_type。类似地,如果F1是可适配一元函数的模型,则它必须定义F1::argument_type和F1::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<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());
注释
[1] “可适配函数对象”这个名称的原因是可适配函数对象可以被函数对象适配器使用。。STL 提供了基类F1::argument_typeunary_function[2] 该基类类似于, input_iterator, output_iterator, forward_iteratorf(x)bidirectional_iteratorrandom_access_iterator
基类:它们是完全空的,仅用于提供类型信息。[3] 这是一个如何使用函数对象的示例;这不是计算向量中元素总和的推荐方法。该accumulate