STL(什麼叫謂詞)

返回值類型爲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;
}

運行結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章