知识点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、函数对象当函数参数
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){
//功能性代码
}
};