美文网首页
函数对象/谓词

函数对象/谓词

作者: Sheik | 来源:发表于2021-08-10 18:52 被阅读0次

环境:ide:Mac+clion

视频链接:
https://www.bilibili.com/video/BV1Hb411Y7E5?p=5

函数对象,也称为仿函数。其实质就是重载operator() 来实现。

1.可以直接作为函数调用。
2.可以操作成员变量。
3.对象可以作为参数进行传递。

class MyAdd{

public:
    int operator()(int v1,int v2){ // 这个被称为仿函数或者函数对象。
        return v1 + v2;
    }
};

class MyPrint{

public:
    MyPrint():m_Count(0){

    }
    void operator()(string msg){//这个也是仿函数。
        cout << msg<<endl;
        this->m_Count++;
    }
    int m_Count;
};

void doPrint(MyPrint &p,string msg){
    p(msg);
}

void test(){ // 这是仿函数或者函数对象最简单的调用。
    MyAdd myAdd;
    int result = myAdd(10,20);
    cout << result<< endl;//30

    MyPrint myPrint; // 这里事例了利用仿函数,操作类中的成员变量。
    myPrint("hello C++");
    myPrint("hello C++");
    myPrint("hello C++");
    cout << myPrint.m_Count<<endl;//3

    doPrint(myPrint,"sheik call");// 这里利用仿函数进行参数传递。sheik call
}

谓词:在仿函数中,返回值是bool 的值 称为谓词。

在operator()中接收一个参数叫做一元谓词。 如果接收两个参数叫做二元谓词。

class GreaterFive{
public:
    bool operator()(int value){//这个称之为一元谓词。
        return value > 5;
    }
};
void test01(){//谓词的适用场景。
    vector<int>v;//定义一个vector

    for (int i=0;i<10;i++){//插入10个数据
        v.push_back(i);
    }
    //这里的需求是:在容器中查找是否有>5的数 _Pred 看见这个参数就是要传一个谓词。
    vector<int>::iterator  it = find_if(v.begin(),v.end(),GreaterFive());//最后传递的参数是一个匿名对象的谓词。
    if (it != v.end()){
        cout << "找到大于5的数:"<<*it<<endl;//6
    }else{
        cout << "没有找到大于5的数"<<endl;
    }
}

二元谓词事例:

class MyCompare{
public:
    bool operator()(int v1,int v2){//二元谓词首先返回值是bool,然后是仿函数,然后有两个
        return v1 > v2;
    }
};
void test02(){
    vector<int>v;
    v.push_back(10);
    v.push_back(30);
    v.push_back(20);
    v.push_back(40);
    v.push_back(50);

    sort(v.begin(),v.end());// 这里通过默认排序,从小到大排序。
    for(vector<int>::iterator it=v.begin();it != v.end();it ++){
        cout << *it << " " ;//10 20 30 40 50
    }
    cout << endl;

    sort(v.begin(),v.end(),MyCompare());//这里改变排序顺序,从大到小。
    for(vector<int>::iterator it=v.begin();it != v.end();it ++){
        cout << *it << " " ;//50 40 30 20 10 
    }
    cout << endl;
}

相关文章

  • 函数对象/谓词

    环境:ide:Mac+clion 视频链接:https://www.bilibili.com/video/BV1H...

  • STL算法之谓词

    概述 返回值类型为bool的普通函数或函数对象都叫谓词。 分类 一元谓词:一个参数 一般用于查找策略 二元谓词:两...

  • C++ STL 否定谓词 not1() not2()

    作用 not1是构造一个与谓词结果相反的一元函数对象。not2是构造一个与谓词结果相反的二元函数对象。 头文件 #...

  • 一元谓词案例与二元谓词案例

    谓词 一元谓词: 函数参数1个,函数返回值是bool类型,可以作为一个判断式 二元谓词: 函数参数2个,函数返回值...

  • 学习SQL【8】-谓词和CASE表达式

    谓词 什么是谓词 谓词就是返回值为真值的函数。对于通常的函数来说,返回值有可能是数字、字符串和日期等,但是谓词的返...

  • boost::ref

    背景 STL和Boost中的算法和函数大量使用了函数对象作为判断式或谓词参数,而这些参数都是传值语义,算法或函数在...

  • C++函数对象、二元谓词、lambda表达式

    C++函数对象、二元谓词、lambda表达式 C风格的函数指针   在C语言中当我们希望使用回调函数这种动作时, ...

  • 六、函数对象、谓词概念、内建函数对象

    1.函数对象的概念 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类...

  • iOS开发小总结(二)

    谓词的使用 谓词就是通过NSPredicate给定的逻辑条件作为约束条件,完成对数据的筛选。 定义谓词对象,谓词对...

  • C++高级之C++内部源码阅读与手写多元谓词

    1.map容器学习 2.multimap 容器学习 3.谓词 与仿函数 空谓词 一元谓词 二元谓词 4.fo...

网友评论

      本文标题:函数对象/谓词

      本文链接:https://www.haomeiwen.com/subject/gxhtbltx.html