C++函数对象Functor与匿名函数对象Lambda表达式详解

C++函数对象Functor与匿名函数对象Lambda表达式详解

什么是函数对象?

C++中的函数对象指的是重载了“()”运算符的类,可以像函数一样被调用,也被称为仿函数。与普通的函数不同的是,函数对象可以保存状态信息或者自定义行为,更加灵活。

在实现上,函数对象重载的“()”运算符应该是一个const成员函数,参数及返回值根据需要而定。函数对象的实现可以参考下面的代码:

class MyFunctor{
public:
    int operator() (int a, int b) const{
        return a + b;
    }
};

函数对象与算法的结合

函数对象通常和STL中的算法一起使用,可以非常方便的实现各种需求。如下面的代码所示,使用std::sort函数对vector容器进行排序,需要传入一个排序的规则比较函数对象。

#include <algorithm>
#include <vector>
#include <iostream>

class MyLess{
public:
    bool operator() (const int& lhs, const int& rhs) const{
        return lhs < rhs;
    }
};

int main()
{
    std::vector<int> nums = {3, 1, 4, 2, 5};
    std::sort(nums.begin(), nums.end(), MyLess());
    for(int num : nums){
        std::cout << num << " ";
    }
}

输出结果为:1 2 3 4 5

Lambda表达式

Lambda表达式是C++11引入的新特性。它是一种匿名函数对象,可以在需要使用函数对象的地方定义,非常方便。Lambda表达式的格式如下:

[capture list] (param list) -> ret type {body};

其中,capture list是捕获列表,用来捕获一些变量,可以为空;param list是形参列表,可以为空;ret type是返回值类型,可以为空;body是函数体。

下面是一个简单的例子,演示Lambda表达式的使用:

#include <iostream>

int main()
{
    auto func = [](){ std::cout << "Hello World" << std::endl; };
    func();
}

输出结果为:Hello World

在上面的代码中,使用auto关键字定义了一个Lambda表达式,并将其赋值给func变量,然后通过调用func()函数来执行Lambda表达式中定义的内容。

Lambda表达式与算法的结合

与函数对象一样,Lambda表达式可以和STL中的算法一起使用。下面是一个实现将vector中的元素按照奇偶性进行分组的例子:

#include <algorithm>
#include <vector>
#include <iostream>

int main()
{
    std::vector<int> nums = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    std::vector<int> odds;
    std::vector<int> evens;
    std::for_each(nums.begin(), nums.end(), [&](int num){
        if(num % 2 == 1){
            odds.push_back(num);
        }
        else{
            evens.push_back(num);
        }
    });
    std::cout << "Odd numbers:";
    for(int num : odds){
        std::cout << " " << num;
    }
    std::cout << std::endl << "Even numbers:";
    for(int num : evens){
        std::cout << " " << num;
    }
}

输出结果为:Odd numbers: 1 3 5 7 9
Even numbers: 2 4 6 8

在上面的代码中,使用std::for_each函数对vector容器中的元素逐一处理,并通过Lambda表达式将奇数和偶数分别插入到不同的容器中。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++函数对象Functor与匿名函数对象Lambda表达式详解 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • Django 实现下载文件功能的示例

    实现 Django 下载文件功能需要以下几个步骤: 1. 定义 URL 和视图函数 在 urls.py 中定义 URL,将其映射到相应的视图函数上。如下所示: from django.urls import path from myapp.views import download_file urlpatterns = [ path(‘download/&l…

    C 2023年5月23日
    00
  • python实现计算倒数的方法

    下面是Python实现计算倒数的方法的攻略: 1. 计算倒数的方法 在Python中,可以通过对数学库math中的函数进行调用,来计算倒数。常用的计算倒数的函数有两个:reciprocal和pow。 reciprocal函数 reciprocal函数是math库中的一个函数,用于计算一个数的倒数。它的使用方法如下: import math num = 3 r…

    C 2023年5月22日
    00
  • C指针原理教程之语法树及其实现

    C指针原理教程之语法树及其实现 什么是语法树 语法树是编译原理中的概念,指的是代码在编译过程中形成的一种树型结构,用来表示代码的语法结构。 例如下面这段代码: int add(int a, int b) { return a + b; } int main() { int x = 1; int y = 2; int z = add(x, y); return…

    C 2023年5月23日
    00
  • C语言版医院管理系统

    C语言版医院管理系统攻略 介绍 C语言版医院管理系统是一个完整的医院管理系统,可以实现包括病人信息管理、医生信息管理、医院排班管理、医生出诊信息管理、病历管理等多项功能。该系统可以实现对医院各种资源和信息的自由管理,方便医院管理人员的工作。 系统需求 操作系统:Windows或Linux C语言编译器:gcc或VS 操作说明 1. 运行程序 下载并解压缩医院…

    C 2023年5月23日
    00
  • 逍遥自在学C语言 | 关系运算符

    前言 一、人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 —— 自在。 第二位上场的是和我们一起学习的小白程序猿 —— 逍遥。 二、构成和表示方式 关系运算符的作用是判断符号两边大小的关系 C语言中的关系运算符主要有六个,如下表所示 运算符 名称 示例 描述 == 等于 a == b 判断a是否等于b != 不等于 a != b 判断a是否不等于…

    C语言 2023年4月17日
    00
  • JavaScript与函数式编程解释

    JavaScript与函数式编程解释 函数式编程是一种编程范式,其中函数被认为是基本构建块。在函数式编程中,函数被视为不产生可见副作用的映射关系。这与传统的命令式编程范式不同,后者关注于使用语句改变程序状态。 JavaScript作为一门多范式的语言,也支持函数式编程。JavaScript中的函数可以作为一等公民,可以像其他对象一样被分配给变量,作为参数传递…

    C 2023年5月22日
    00
  • 全解史上最快的JOSN解析库alibaba Fastjson

    快速解析JSON数据是现代程序设计中非常常见的操作之一。阿里巴巴提供的Fastjson是一种高度优化的开源JSON解析库,可实现快速的JSON序列化和反序列化。 Fastjson的使用步骤 下载并导入Fastjson包。 创建JSON对象 JSONObject object = new JSONObject(); object.put(“name”, “Jo…

    C 2023年5月23日
    00
  • 详解Python 协程的详细用法使用和例子

    详解Python 协程的详细用法使用和例子 简介 协程(Coroutine)是一种能够暂停执行并保存状态以便之后恢复执行的函数。在Python中,协程可用于高效的异步编程。通过使用async/await语法,我们可以创建协程对象并通过事件循环(Event Loop)的调度运行它们。 协程的基本使用 定义一个协程函数的标准语法如下: async def cor…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部