C++仿函数对象

本文介绍了C++中的函数对象(仿函数),包括其本质、特点和应用场景。通过示例展示了如何创建和使用自定义的函数对象,如加法运算符重载的MyAdd类和打印计数器的MyPrint类。此外,还讨论了谓词的概念,如一元谓词和二元谓词,并使用内置函数对象进行容器操作。
摘要由CSDN通过智能技术生成

/*
    函数对象
        重载函数调用操作符的类,气对象常称为函数对象
        函数对象使用重载的()时,行为类似函数调用,也叫仿函数
    本质
        函数对象(仿函数)是一个类,不是一个函数
    特点
        1.函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值
        2.函数对象超出普通函数的概念,函数对象可以有自己的状态(类具有自己的属性)
        3.函数对象可以作为参数传递

*/
class MyAdd {
public:
    int operator()(int a, int b) {
        return a + b;
    }
};

void test01() {
    MyAdd myAdd;//函数对象
    cout<< myAdd(10,20)<<endl;
}

class MyPrint {
public:
    // 构造函数
    MyPrint() {
        this->count = 0;
    }
    int operator()(string test) {
        cout << test << endl;
        count++;
    }
    int count;// 内部属性
};

void test02() {
    MyPrint myPrint;//函数对象
    cout << myPrint("hello world") << endl;
    cout << myPrint("hello world") << endl;

    cout << "myPrint调用的次数为:" << myPrint.count << endl;

}

void doPrint(MyPrint& mp,string test) {
    mp(test);
}

void test03() {
    MyPrint myPrint;//函数对象
    doPrint(myPrint,"Hello c++");

}

/*
    谓词
        返回bool类型的仿函数称为谓词
        如果operator()接收一个参数,叫做一元谓词
        如果operator()接收二个参数,叫做二元谓词

*/

//一元谓词
class GreaterFive {
public:
    bool operator()(int val) {
        return val > 5;
    }
};
void test04(){
    vector<int> v;
    for (int i = 0; i < 10; i++)
        v.push_back(i);

    // 查找容器中有没有大于5的数字
    // 匿名函数对象GreaterFive()
    // 未找到返回最后一个迭代器
    auto iter=find_if(v.begin(), v.end(), GreaterFive());
    cout << *iter << endl;
}

// 二元谓词
class MyCompare {
public:
    bool operator()(int a, int b) {
        return a > b;
    }

};

void test05() {
    vector<int> v;
    for (int i = 0; i < 10; i++)
        v.push_back(i);
    // 默认从小到大
    // 利用仿函数对象修改算法的排序规则
    sort(v.begin(), v.end(), MyCompare());
}

/*
    STL内建了一些函数对象
    分类:
        算数仿函数
        关系仿函数
        逻辑仿函数
    用法:
        这些仿函数所产生的的对象,用法和一般函数完全相同
        使用内建函数对象,需要引入头文件 #include<functional>
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值