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;
}

运行结果:
在这里插入图片描述

发布了78 篇原创文章 · 获赞 45 · 访问量 9262

猜你喜欢

转载自blog.csdn.net/weixin_43288201/article/details/105255288