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

仿函数(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()系调用函数对象 foopeator(),而非调用函数fo()

References

[1] STL源码剖析 第七章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值