概念
返回值类型为bool的普通函数或仿函数就叫谓词
如果普通函数或仿函数,有一个参数就叫一元谓词
如果普通函数或仿函数,有两个参数就叫二元谓词
作用
谓词通常用于算法中的判断条件,例如在排序算法中指定元素的比较规则,或者在查找算法中指定要查找的条件。
例:找到第一个大于20的数
一元谓词案例
1.普通函数作二元谓词实现
bool greaterThan20(int val)
{
return val>20;
}
int main()
{
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;
vector<int>::iterator ret;
ret=find_if(v.begin(),v.end(),greaterThan20);
if(ret != v.end())
{
cout<<"第一个大于20的数为:"<<*ret<<endl;
}
return 0;
}
2.仿函数作为一元谓词实现
class MyGreaterThan20
{
public:
bool operator()(int val)
{
return val>20;
}
};
int main()
{
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;
vector<int>::iterator ret;
ret=find_if(v.begin(),v.end(),MyGreaterThan20());
if(ret != v.end())
{
cout<<"第一个大于20的数为:"<<*ret<<endl;
}
return 0;
}
二元谓词案例
1.普通函数作为二元谓词实现
bool myGreater(int val1,int val2)
{
return val1>val2;
}
int main()
{
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);
for_each(v.begin(),v.end(),[](int val){cout<<val<<" ";});
cout<<endl;
return 0;
}
2.仿函数作为二元谓词实现
class MyGreater
{
public:
bool operator()(int val1,int val2){
return val1>val2;
}
};
int main()
{
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());
for_each(v.begin(),v.end(),[](int val){cout<<val<<" ";});
cout<<endl;
return 0;
}