返回值类型为bool的普通函数或仿函数 就叫谓词。
如果普通函数或仿函数 有一个参数 就叫一元谓词。
如果普通函数或仿函数 有二个参数 就叫二元谓词。
谓词是指普通函数或重载的operator()返回值是bool类型的函数对象(仿函数)。如 果operator接受一个参数,那么叫做一元谓词,如果接受两个参数,那么叫做二元 谓词,谓词可作为一个判断式。
案例:一元谓词
//普通函数作为一元谓词
bool greaterThan20(int val)
{
return val>20;
}
//仿函数作为一元谓词
class MyGreaterThan20
{
public:
bool operator()(int val)
{
return val>20;
}
};
void test01()
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(50);
for_each(v.begin(),v.end(),[](int val){cout<<val<<" ";});
cout<<endl;
//需求:找出第一个大于20的数
vector<int>::iterator ret;
//普通函数完成
//ret = find_if(v.begin(),v.end(), greaterThan20);
ret = find_if(v.begin(),v.end(), MyGreaterThan20());
if(ret != v.end())
{
cout<<"第一个大于20的数为:"<<*ret<<endl;
}
}
运行结果:
案例2:二元谓词
//普通函数作为二元谓词
bool myGreater(int v1,int v2)
{
//为啥从大到小 排序
return v1>v2;
}
//仿函数作为二元谓词
class MyGreater
{
public:
bool operator()(int v1,int v2)
{
return v1>v2;
}
};
void test02()
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(50);
for_each(v.begin(),v.end(),[](int val){cout<<val<<" ";});
cout<<endl;
//从大-->小排序
//sort(v.begin(),v.end(), myGreater);
sort(v.begin(),v.end(), MyGreater());
for_each(v.begin(),v.end(),[](int val){cout<<val<<" ";});
cout<<endl;
}
运行结果: