C++中的谓词

        谓词是指普通函数重载的operator()返回值是bool类型的函数对象(仿函数)。如果operator接受一个参数,那么叫做一元谓词,如果接受两个参数,那么叫做二元谓词,谓词可作为一个判断式。

一元谓词

class num_1{                    //伪函数
    public:
        bool operator()(int val) //重载
        {
            return val > 3;
        }
};

int main(void)
{

    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    v.push_back(5);

    // num_1 p1;
    // 返回值是迭代器
    // find_if(v1.begin(), v1.end(), num_1());  //匿名对象写法
    // find_if(v1.begin(), v1.end(), p1);

    vector<int>::iterator a = find_if(v.begin(), v.end(), num_1()); // 匿名对象写法

    if(a != v.end())
    {
        cout << "找到了大于3的元素:" << *a << endl;
    }
    else
    {
        cout << "没有找到" << endl;
    }

        我在代码使用了一元谓词,即重载了()运算符的自定义类num_1作为find_if函数的参数。这个一元谓词返回一个bool值,判断输入的值是否大于3。通过调用find_if函数,在vector容器中查找第一个满足该条件的元素。如果找到了,就输出该元素的值;如果没有找到,就输出"没有找到"。

二元谓词

class num_2{      //二元谓词
    public:
        bool operator()(int a1,int a2)
        {
            return a1 > a2;
        }
};

void num_1(int a)      //打印回调函数
{
    cout << a << " ";
}

int main(void)
{

    vector<int> v;
    v.push_back(1);
    v.push_back(9);
    v.push_back(5);
    v.push_back(10);
    v.push_back(5);

    // //二元谓词
    // sort(v.begin(), v.end());

    sort(v.begin(), v.end(), num_2());   //匿名对象写法

    for_each(v.begin(), v.end(), num_1);   //不写小括号的方法就叫回调函数

        for_each(v.begin(), v.end(), [](int a){ cout << a << " "; });   //写法二lambda表达式

        我在代码中使用了一个二元谓词来对vector容器中的元素进行排序。二元谓词是一个类,其中重载了一个()运算符,该运算符接受两个参数并返回一个bool值。在本例中,二元谓词的功能是判断第一个参数是否大于第二个参数。

        在main函数中,通过sort函数对vector容器v进行排序,第三个参数传入了一个匿名对象num_2(),表示使用该二元谓词对元素进行排序。

        接下来使用for_each函数对排序后的vector容器进行遍历,其中第二个参数传入了一个函数指针num_1,表示使用该函数作为回调函数来处理每个元素。回调函数的功能是打印每个元素。

        我在代码还展示了一种使用lambda表达式作为回调函数的写法。lambda表达式是一种匿名函数的写法,用于简化函数的定义和使用。在本例中,lambda表达式内部定义了一个匿名函数,功能与num_1函数相同,即打印元素。通过在for_each函数中直接使用lambda表达式作为回调函数,可以简化代码的书写。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值