返回值類型爲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;
}
運行結果: