• C++ functional库中的仿函数


    一、仿函数简介

    仿函数(functor)又称之为函数对象(function object),实际上就是 重载了()操作符 的 struct或class。
    由于重载了()操作符,所以使用他的时候就像在调用函数一样,于是就被称为“仿”函数啦。

    二、仿函数简要写法示例

    一个很正常的需求,定义一个仿函数作为一个数组的排序规则:
    将数组从大到小排序

    class Cmp {
    public:
        bool operator()(const int &a, const int &b) {
            return a > b;
        }
    };
    

    使用

    vector<int> a(10);
    iota(begin(a), end(a), 1);
    
    sort(begin(a), end(a), Cmp());  // 使用()
    
    for (auto x : a) {
      cout << x << " ";
    }
    

    输出
    10 9 8 7 6 5 4 3 2 1

    三、使用C++自带的仿函数

    在C++ 的functional头文件中,已经为我们提供好了一些仿函数,可以直接使用。

    (1)算术仿函数

    1.plus 计算两数之和
    例:将两个等长数组相加

        vector<int> a(10), b(a);
        iota(begin(a), end(a), 1);
        iota(begin(b), end(b), 1);
    
        transform(begin(a), end(a), begin(b), begin(a), plus<int>());
    
        for (auto x : a) {
            cout << x << " ";
        }
    

    输出
    2 4 6 8 10 12 14 16 18 20
    2.minus 两数相减
    将上面那个例子改一改:

    transform(begin(a), end(a), begin(b), begin(a), minus<int>());
    

    输出
    0 0 0 0 0 0 0 0 0 0

    3.multiplies 两数相乘
    再将上面那个例子改一改:

    transform(begin(a), end(a), begin(b), begin(a), multiplies<int>());
    

    输出
    1 4 9 16 25 36 49 64 81 100

    4.divides 两数相除
    还将上面那个例子改一改:

    transform(begin(a), end(a), begin(b), begin(a), divides<int>());
    

    输出
    1 1 1 1 1 1 1 1 1 1

    5.modules 取模运算
    继续将上面那个例子改一改:

    transform(begin(a), end(a), begin(b), begin(a), modulus<int>());
    

    输出
    0 0 0 0 0 0 0 0 0 0

    6.negate 相反数
    这次不能那样改了,因为上述的五个仿函数是二元仿函数,是对两个操作数而言的。
    negate是一元仿函数,只能对一个参数求相反数。
    所以我们对a数组求相反数:

    transform(begin(a), end(a), begin(a), negate<int>());
    

    输出
    -1 -2 -3 -4 -5 -6 -7 -8 -9 -10

    (2)关系仿函数

    1.equal_to 是否相等
    2.not_equal_to 是否不相等
    3.greater 大于
    4.less 小于
    5.greater_equal 大于等于
    6.less_equal 小于等于
    到这时,我们就可以看出,可以使用 greater() 来代替我们开头实现的例子
    将数组从大到小排序:

    vector<int> a(10);
    iota(begin(a), end(a), 1);
    
    sort(begin(a), end(a), greater<int>());  // 使用()
    
    for (auto x : a) {
      cout << x << " ";
    }
    

    输出
    10 9 8 7 6 5 4 3 2 1

    (3)逻辑仿函数

    1.logical_and 二元,求&
    2.logical_or 二元,求|
    3.logical_not 一元,求!

    使用方法同上.
    话说,并没有发现求异或的仿函数..

  • 相关阅读:
    2018年五一杯数学建模C题江苏省本科教育质量综合评价解题全过程文档及程序
    QT5槽函数的重载问题
    Java super 关键字使用,它与 this 关键字有什么区别?
    信息安全服务资质认证-安全工程一级
    Gin vs Beego: Golang的Web框架之争
    消除两个inline-block元素之间的间隔
    从电脑QQ上恢复聊天记录备份到手Q,却一直显示手机QQ账号处于离线状态,请上线后再尝试?
    汽车以太网协议栈
    机器学习(四)R平方和回归模型的评价
    已知起始点坐标、目的地方位角,计算沿着测地线飞行一定距离到达的目的地坐标
  • 原文地址:https://www.cnblogs.com/Aatrowen-Blog/p/16112067.html