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日

相关文章

  • Ubuntu环境下使用G++编译CPP文件

    以下是Ubuntu环境下使用G++编译CPP文件的完整攻略: 安装G++ 在Ubuntu环境下使用G++编译C++文件,首先需要安装G++编译器。可以通过以下命令进行安装: sudo apt-get update sudo apt-get install g++ 编写C++文件 在安装好G++编译器之后,可以使用任何文本编辑器编写需要编译的C++文件。例如,…

    C 2023年5月23日
    00
  • C++课程设计之学生成绩管理系统

    C++课程设计之学生成绩管理系统攻略 1. 系统设计思路 学生成绩管理系统主要分为三个部分:学生信息管理、课程信息管理与成绩信息管理。本设计中,我们采用C++语言实现该系统。 学生信息管理:包括学号、姓名、性别、年龄等信息; 课程信息管理:包括课程名、课程编号、开课学期等信息; 成绩信息管理:包括学号、课程名、成绩等信息。 在该系统设计中,我们采用文件读写实…

    C 2023年5月23日
    00
  • C语言的语法风格与代码书写规范指南

    C语言的语法风格与代码书写规范指南 C语言作为一门编程语言,具有严谨、简洁、高效的特点。为了使得代码易于维护、易于理解、易于扩展,需要遵守一些语法风格与代码书写规范。 命名规范 变量名、函数名等采用小写字母加下划线的方式,如:user_id 宏定义采用全部大写的方式,如:#define MAX_NUM 100 结构体名、枚举类型名首字母大写,采用驼峰命名法,…

    C 2023年5月23日
    00
  • iOS底层探索之自动释放池原理解析

    iOS底层探索之自动释放池原理解析 什么是自动释放池 自动释放池是一种机制,用于在Objective-C中管理内存。具体来说,自动释放池是一个用于暂时存储不需要的Objective-C对象的容器,当自动释放池被销毁时,它所包含的所有对象都被发送一条autorelease消息。autorelease消息会将这些对象的引用计数减一,如果引用计数变为0,对象会立即…

    C 2023年5月23日
    00
  • C++ 内存分配处理函数set_new_handler的使用

    当C++程序在运行时发现内存分配失败时,会抛出一个std::bad_alloc异常。为了避免程序崩溃,我们可以使用set_new_handler函数来注册一个新的处理函数,当内存分配失败时,程序会调用该函数来处理内存分配失败的情况。 set_new_handler函数的语法 set_new_handler函数是一个全局函数,它的原型如下: std::new_…

    C 2023年5月23日
    00
  • c#版json数据解析示例分享

    下面就详细讲解“C#版JSON数据解析示例分享”的完整攻略。 什么是JSON? JSON是JavaScript Object Notation的简称,是一种轻量级的数据交换格式,易于使用并且易于阅读和编写。在网络应用中,它通常用于与服务器进行交换数据。 JSON格式的数据通常使用大括号{}括起来,其中包含一个或多个键值对。其中,键是字符串,值可以是数字、字符…

    C 2023年5月23日
    00
  • C++ 中类对象类型的转化的实例详解

    C++ 中类对象类型的转化的实例详解 什么是类型转换? 类型转换是将数据从一种数据类型转换为另一种数据类型的过程。在 C++ 中,有几种类型转换的方式: 隐式类型转换:在表达式中,某些情况下,C++ 会自动将一种类型转换为另一种类型。例如,int x = 10; float y = x; 在将 int 类型赋值给 float 类型时,C++ 会自动完成数据类…

    C 2023年5月22日
    00
  • C程序 查找两个数字的最小公倍数

    首先,在你的网站上创建一个名为“C程序 查找两个数字的最小公倍数”的页面或文章,为其添加一个适当的标题。 在页面中,先简要介绍最小公倍数的概念和计算方法。可以引用一些相关的数学知识。 给出代码的具体说明。可以使用代码块标记,将代码复制到文本编辑器中然后添加到文章中。代码需要包含详细的注释,以便读者理解其逻辑。 给出一个简单示例,用于说明程序如何工作。比如,可…

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