【C++】STL函数对象

1.函数对象

1.1 基本概念

重载了函数调用操作符的类,其对象称为函数对象,函数对象的函数也叫做仿函数。

函数对象的本质是一个类,并不是一个函数。

1.2 使用

  • 函数对象在使用时,和普通函数一样,可以有参数,可以有返回值
  • 函数对象可以作为参数传递
  • 函数对象超出普通函数的概念,函数对象可以有自己的状态

2.谓词

基本概念:

  • 返回bool类型的仿函数称为谓词
  • 如果传入参数为一个,则称其为一元谓词
  • 如果传入参数为两个,则称其为二元谓词

3.内建函数对象

3.1 概念

在STL中已经定义好的的一些函数对象。

使用时,引入头文件 #include <functional>

内建函数对象的分类:

  • 算术仿函数:实现四则运算

    • 加-plus
    • 减-minus
    • 乘-multiplies
    • 除-divides
    • 取模-modulus
    • 取反-negete(一元运算)

    算术运算符例:

    #include <functional>
    
    using namespace std;
    
    void test1()
    {
        negate<int> neg;    // 取反运算,一元运算
        cout << neg(50) << endl;
    }
    // 输出结果:-50
    void test2()
    {
        plus<int> p;    // 加法运算,二元运算
        cout << p(50, 50) << endl;
    }
    // 输出结果:100
    
  • 关系仿函数:实现关系运算

    • 等于-equal_to
    • 不等于-not_equal_to
    • 大于-greater
    • 大于等于-greater_equal
    • 小于-less
    • 小于等于-less_equal

    关系运算符例:

    // #include <functional>    // 內建函数对象头文件
    // #include <vector>    // vector容器头文件
    // #include <algorithm>     // 标准算法头文件
    
    // 仿函数
    class MyCompare
    {
    public:
        bool operator()(int a, int b)
        {
            return a > b;
        }
    };
    // 重载左移运算符来输出vector容器
    ostream& operator<<(ostream& cout, vector<int>& v)
    {
        for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
        {
            cout << *it << " ";
        }
        return cout;
    }
    void test3()
    {
        vector<int> v;
        for (int i = 0; i < 10; ++i)
        {
            v.push_back(rand() % 15);
        }
        cout << v << endl;
        // 自定义的仿函数实现
        // sort(v.begin(), v.end(), MyCompare());
    
        // 内建函数对象
        sort(v.begin(), v.end(), greater<int>());   // 大于
        cout << v << endl;
    }
    
  • 逻辑仿函数:

    • 与-logical_and
    • 或-logical_or
    • 非-logical_not:一元运算符
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值