您的位置:首页 > 移动开发 > Objective-C

仿函数(functors/function objects)原理及使用

2016-02-19 08:53 736 查看
仿函数(functors,或名 function objects,函数对象),是 STL 六大组件(Components)的重要一环,如下图:



在STL的历史上,仿函数(functors)是早期的命名,C++ 标准定案后使用函数对象(function objects)的叫法。就实现意义而言,“函数对象”:一种具有函数性质的对象(本质为对象)。不过,就其行为而言,以及就中文用词的清晰漂亮和独特性而言,“仿函数”一次较为鲜明。

仿函数的应用场景主要在:作为算法组件中的相关函数接口的参数。更具体地说,STL 所提供的各种算法,往往有两个版本,其中一个版本表现出最常用(或最直观)的某种运算第二个版本则表现出最泛化的演算流程,允许用户“以 template 参数来指定所要采行的策略”。就拿
accumulate()
(<numeric>头文件)来说,其一般行为(第一个版本)是将指定范围内的所有元素相加,第二个版本则允许你指定某种“操作”(甚至是相乘),取代第一个版本中的“相加”行为。

template<typename T>
struct multiplier :public std::binary_function<T, T, T>
{
T operator() (const T& left, const T& right) const
{
return left*right;
}
}

int main(int, char**)
{
std::vector<int> v = {1, 2, 3, 4, 5};
std::cout << std::accumulate(v.begin(), v.end(), 1, multiplier<int>()) << std::endl;
// 1*1*2*3*4*5=120
return 0;
}


再举
sort()
为例,其第一版本是以
operator<
为排序时的元素位置调整依据,第二个版本则允许用户指定任何“操作”,务求排序后的两两相邻元素都能令该操作结果为
true


STL 仿函数的分类,

若以操作数(operand)的个数划分,可分为一元(unary_function)和二元(binary_function)仿函数

若以功能划分,可分为算术运算(Arithmetic)、关系运算(Rational)、逻辑运算(Logical)三大类

函数对象(function objects)的概念

所谓 function object (或者说 functor),是一个定义了
operator()
的对象,

FunctionObjectType fo;
...
fo();


中的表达式
fo()
系调用函数对象
fo
opeator()
,而非调用函数
fo()


References

[1] STL源码剖析 第七章
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: