知识点1:函数对象(仿函数)

1、语法

本质:

一般是重载了()函数的类实例化的对象,就是函数对象

该类的对象可以像函数一样调用,所以又称仿函数。

分类:一元仿函数+二元仿函数

class Rule
{
public:
    返回值类型 operator ()(参数类型1 参数1,参数类型2 参数2){
            //功能性代码
    }
};
class Rule_1
{
public:
    返回值类型 operator ()(参数类型1 参数1){
       //功能性代码
    }
};

2、仿函数和普通函数区别

函数对象超出了普通函数的概念,可以保存函数的调用状态。

#include <iostream>
using namespace std;
class Rule_1
{
public:
    int count=0;
    void operator ()(int a){
        cout<<"仿函数"<<a<<endl;
         count++;
    }
};
void rule(int num){
    int count=0;
    cout<<"普通函数"<<num<<endl;
    count++;
}
int main(int argc, char *argv[])
{
    Rule_1 a;
    a(10);
    a(10);
    cout<<"仿函数调用 "<<a.count<<"次"<<endl;
    rule(10);//普通函数
    //cout<<"普通函数调用 "<<count<<"次"<<endl;//error
    return 0;
}

3、函数对象当函数参数

函数对象&谓词_谓词

函数对象&谓词_仿函数_02

4、函数对象(仿函数)应用场景(重点)

给算法提供策略。

#include <iostream>
#include <set>
using namespace std;
class Rule_2
{
public:
    bool operator ()(int a,int b){
        return a>b;
    }
};
void printset(  set<int,Rule_2> &s){
   set<int>::const_iterator it=s.begin();
    for(;it!=s.end();it++){
        cout<<*it<<"  ";
    }
    cout<<endl;
}
int main(int argc, char *argv[])
{
   set<int,Rule_2> s;
   s.insert(2);
   s.insert(1);
   s.insert(9);
   s.insert(7);
   s.insert(5);
   printset(s);
}

知识点2:谓词

返回值是bool类型普通函数或者仿函数都是谓词。

谓词分类:

一元谓词和二元谓词。

//一元谓词
bool fun(参数类型1 参数1){
}
class Rule
{
public:
    bool operator ()(参数类型1 参数1){
       //功能性代码
    }
};
//二元谓词
bool fun(参数类型1 参数1,参数类型2 参数2){
}
class Rule
{
public:
    bool operator ()(参数类型1 参数1,参数类型2 参数2){
       //功能性代码
    }
};