STL算法之谓词

2022-10-16  本文已影响0人  二进制人类

概述

返回值类型为bool的普通函数或函数对象都叫谓词。

分类

一元谓词:一个参数 一般用于查找策略

二元谓词:两个参数 一般用于排序策略

实现

一元谓词

#include <iostream>
#include <string>
#include<vector>
#include<algorithm>
using namespace std;
//函数对象作为谓词
class GreaterThan40
{
public:
    bool operator()(int value){
        return value>40;
    }
};
//普通函数作为谓词
bool greaterThan40(int value){
    return value>40;
}
int main()
{
    vector<int> v;
    v.push_back(30);
    v.push_back(40);
    v.push_back(20);
    v.push_back(50);
    v.push_back(10);
    vector<int>::iterator ret;
    ret = find_if(v.begin(),v.end(),GreaterThan40());
    if(ret!=v.end()){
        cout<<"第一个大于40的数:"<<*ret<<endl;//50
    }
    return 0;
}

二元谓词

#include <iostream>
#include <string>
#include<vector>
#include<algorithm>
using namespace std;
//普通函数作为谓词
bool myGreater(int v1, int v2)
{
    return v1>v2;
}
//函数对象作为谓词
class MyGreater
{
public:
    bool operator()(int v1, int v2)
    {
        return v1>v2;
    }
};
int main()
{
    vector<int> v;
        v.push_back(30);
        v.push_back(40);
        v.push_back(20);
        v.push_back(50);
        v.push_back(10);
        //sort(v.begin(), v.end(), myGreater);
        sort(v.begin(), v.end(), MyGreater());
        vector<int>::iterator it=v.begin();
        for(;it!=v.end();it++)
        {
            cout<<*it<<" ";
        }
        cout<<endl;
    return 0;
}

内建函数对象

//6 个算数类函数对象,除了 negate 是一元运算,其他都是二元运算。
template<class T> T plus<T>//加法仿函数
template<class T> T minus<T>//减法仿函数
template<class T> T multiplies<T>//乘法仿函数
template<class T> T divides<T>//除法仿函数
template<class T> T modulus<T>//取模仿函数
template<class T> T negate<T>//取反仿函数

//6 个关系运算类函数对象,每一种都是二元运算。
template<class T> bool equal_to<T>//等于
template<class T> bool not_equal_to<T>//不等于
template<class T> bool greater<T>//大于
template<class T> bool greater_equal<T>//大于等于
template<class T> bool less<T>//小于
template<class T> bool less_equal<T>//小于等于

//逻辑运算类运算函数,not 为一元运算,其余为二元运算。
template<class T> bool logical_and<T>//逻辑与
template<class T> bool logical_or<T>//逻辑或
template<class T> bool logical_not<T>//逻辑非

实例

void test(){
    vector<int> v;
    v.push_back(30);
    v.push_back(40);
    v.push_back(20);
    v.push_back(50);
    v.push_back(10);
    vector<int>::iterator ret;
    ret = find_if(v.begin(),v.end(),bind2nd(greater<int>(),40));
    if(ret!=v.end()){
        cout<<"第一个大于40的数:"<<*ret<<endl;
    }
}
上一篇下一篇

猜你喜欢

热点阅读