环境:ide:Mac+clion
视频链接:
https://www.bilibili.com/video/BV1Hb411Y7E5?p=5
函数对象,也称为仿函数。其实质就是重载operator() 来实现。
1.可以直接作为函数调用。
2.可以操作成员变量。
3.对象可以作为参数进行传递。
class MyAdd{
public:
int operator()(int v1,int v2){ // 这个被称为仿函数或者函数对象。
return v1 + v2;
}
};
class MyPrint{
public:
MyPrint():m_Count(0){
}
void operator()(string msg){//这个也是仿函数。
cout << msg<<endl;
this->m_Count++;
}
int m_Count;
};
void doPrint(MyPrint &p,string msg){
p(msg);
}
void test(){ // 这是仿函数或者函数对象最简单的调用。
MyAdd myAdd;
int result = myAdd(10,20);
cout << result<< endl;//30
MyPrint myPrint; // 这里事例了利用仿函数,操作类中的成员变量。
myPrint("hello C++");
myPrint("hello C++");
myPrint("hello C++");
cout << myPrint.m_Count<<endl;//3
doPrint(myPrint,"sheik call");// 这里利用仿函数进行参数传递。sheik call
}
谓词:在仿函数中,返回值是bool 的值 称为谓词。
在operator()中接收一个参数叫做一元谓词。 如果接收两个参数叫做二元谓词。
class GreaterFive{
public:
bool operator()(int value){//这个称之为一元谓词。
return value > 5;
}
};
void test01(){//谓词的适用场景。
vector<int>v;//定义一个vector
for (int i=0;i<10;i++){//插入10个数据
v.push_back(i);
}
//这里的需求是:在容器中查找是否有>5的数 _Pred 看见这个参数就是要传一个谓词。
vector<int>::iterator it = find_if(v.begin(),v.end(),GreaterFive());//最后传递的参数是一个匿名对象的谓词。
if (it != v.end()){
cout << "找到大于5的数:"<<*it<<endl;//6
}else{
cout << "没有找到大于5的数"<<endl;
}
}
二元谓词事例:
class MyCompare{
public:
bool operator()(int v1,int v2){//二元谓词首先返回值是bool,然后是仿函数,然后有两个
return v1 > v2;
}
};
void test02(){
vector<int>v;
v.push_back(10);
v.push_back(30);
v.push_back(20);
v.push_back(40);
v.push_back(50);
sort(v.begin(),v.end());// 这里通过默认排序,从小到大排序。
for(vector<int>::iterator it=v.begin();it != v.end();it ++){
cout << *it << " " ;//10 20 30 40 50
}
cout << endl;
sort(v.begin(),v.end(),MyCompare());//这里改变排序顺序,从大到小。
for(vector<int>::iterator it=v.begin();it != v.end();it ++){
cout << *it << " " ;//50 40 30 20 10
}
cout << endl;
}