C++ 中的Lambda表达式写法

yizhihongxing

当我们需要在C++中写一些短的、临时的函数时,常常使用Lambda表达式。Lambda表达式可以看作是一个匿名函数,它可以在任意处声明和定义,并且不会产生额外的开销。本文将详细讲解如何在C++中使用Lambda表达式。

基本语法

Lambda表达式的语法如下:

[capture clause] (parameters) -> return_type { body }
  • capture clause: 捕获列表。用于在Lambda表达式中访问外部变量。
  • parameters:参数列表。与普通函数的参数列表相同。
  • return_type: 返回值类型。与普通函数的返回值类型相同。
  • body: 函数体。

下面是一个简单的示例:

auto func = []() { std::cout << "Hello, World!"; };
func();

输出:"Hello, World!"。

在这个示例中,我们定义了一个Lambda表达式,这个Lambda表达式不带参数,没有返回值。我们使用auto关键字定义了一个变量func,它的类型是一个匿名函数类型。我们可以通过func()来调用匿名函数,并输出“Hello, World!”信息。

捕获列表

Lambda表达式中的捕获列表用于在Lambda表达式中使用外部变量。捕获列表有两种类型:按值捕获和按引用捕获。

按值捕获

按值捕获需要在捕获列表中使用‘=’符号。例如:

int x = 100;
auto f = [x]() { std::cout << x; };
f();  // 输出:100

在这个示例中,我们定义了一个值为100的整数变量x。我们使用[x]捕获变量x,并定义了一个匿名函数,这个函数将在当前作用域中拷贝一份x,然后输出x的值。

按引用捕获

按引用捕获需要在捕获列表中使用‘&’符号。例如:

int x = 100;
auto f = [&x]() { std::cout << x; };
f();  // 输出:100

在这个示例中,我们定义了一个值为100的整数变量x。我们使用[&x]捕获变量x的引用,定义了一个匿名函数,这个函数可以访问外部的变量x,并输出x的值。

显式捕获

在C++14中,Lambda表达式支持显式捕获。显式捕获可以明确指定要捕获的变量。例如:

int x = 100, y = 200;
auto f = [x, &y]() { std::cout << x + y; };
f();  // 输出:300

在这个示例中,我们定义了两个整数变量x和y。我们使用[x, &y]显式捕获这两个变量。Lambda表达式定义后,可以访问外部变量x的值,但是可以修改外部变量y的值。

捕获this指针

Lambda表达式中还可以捕获this指针,例如:

class MyClass {
public:
    void func() {
        auto f = [this]() { std::cout << m_a; };
        f();  // 输出:100
    }
private:
    int m_a = 100;
};

在这个示例中,我们定义了一个MyClass类,这个类中有一个整数成员变量m_a。在MyClass类中定义了一个函数func,这个函数中使用Lambda表达式捕获this指针,然后访问类中的成员变量m_a。在func函数中调用这个Lambda表达式并输出类的成员变量m_a的值。

示例

使用Lambda排序

Lambda表达式最常用于STL库中的算法中,例如std::sort。下面是一个使用Lambda表达式对数组进行排序的示例:

#include <iostream>
#include <algorithm>

int main() {
  int arr[] = {3, 5, 1, 4, 2};
  std::sort(arr, arr+5, [](int a, int b){ return a > b; });
  for (auto i : arr) {
    std::cout << i << " ";
  }
  return 0;
}

在这个示例中,我们定义了一个5个元素的整数数组arr。我们使用std::sort算法进行升序排序。在std::sort的第三个参数中使用Lambda表达式,这个Lambda表达式按照a > b的规则排序。

使用Lambda计算数组的和

下面是一个使用Lambda表达式计算数组和的示例:

#include <iostream>
#include <numeric>
#include <vector>

int main() {
  std::vector<int> v{ 1, 2, 3, 4, 5 };
  int sum = std::accumulate(v.begin(), v.end(), 0, [](int value, int element) {
    return value + element;
  });
  std::cout << "sum: " << sum << std::endl; // 输出:sum: 15
  return 0;
}

在这个示例中,我们定义了一个包含5个元素的std::vector数组v。然后使用std::accumulate算法计算v数组中所有元素的和。在std::accumulate算法中使用Lambda表达式,这个Lambda表达式实现了将所有元素相加的功能。

总结

Lambda表达式是C++11的一个重要特性,它在C++中允许实现轻量级的、匿名的、可传递的、可执行的函数对象。通过捕获列表,Lambda表达式可以访问和操作外部变量,通过Lambda表达式,我们可以更加方便和简洁地实现一些算法和功能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 中的Lambda表达式写法 - Python技术站

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

相关文章

  • 详解Linux查找目录下的按时间过滤的文件

    以下是详解Linux查找目录下的按时间过滤的文件的完整攻略。 查找命令介绍 Linux中经常使用的查找命令是find命令。find命令的语法格式如下: find <path> <expression>… 其中,<path>是要查找的目录路径,<expression>是查找的表达式,可以使用多个表达式来进行组…

    C 2023年5月22日
    00
  • 如何在 C++ 中实现一个单例类模板

    当我们在开发一个项目时,有时需要一个只能被实例化一次的类,这种情况下就需要使用单例模式。C++中实现单例模式可以通过单例类模板来实现。 下面详细讲解如何在C++中实现一个单例类模板: 1. 定义单例类 template<typename T> class Singleton { public: static T& instance() {…

    C 2023年5月23日
    00
  • Lua中的一些常用函数库实例讲解

    我来为你讲解“Lua中的一些常用函数库实例讲解”的完整攻略。 Lua中的一些常用函数库实例讲解 1. string库 string库是Lua中的一个基本库,提供了一系列的字符串操作函数。下面分别介绍几个常用的函数: 1.1 string.sub(string, i [, j]) 该函数用于返回从字符串string的第i个字符开始到第j个字符结束的子串。如果j…

    C 2023年5月22日
    00
  • Redis中SDS简单动态字符串详解

    Redis中SDS简单动态字符串详解 什么是SDS? SDS是Redis中的一个数据存储结构,全称为Simple Dynamic Strings,即简单动态字符串。SDS和C语言中的字符串很相似,但是在Redis中使用了自己的数据结构来实现。相比于C语言中的字符串数组,SDS有更好的性能表现。 SDS的数据结构 SDS的数据结构由以下三部分组成: len:表…

    C 2023年5月22日
    00
  • C语言 指针

    下面是关于C语言指针的完整使用攻略: 简介 指针是一种特殊的变量类型,它存储内存地址的值。通过指针,可以改变变量的值或者访问已分配的堆内存中的值。指针在C语言中具有重要的地位,理解指针也是C语言编程的基础之一。 指针的定义 指针定义的一般形式为:数据类型 *指针变量名。其中,数据类型是指针所指向的变量类型,指针变量名是指针变量在程序中的标识符。 示例: in…

    C 2023年5月9日
    00
  • jupyter notebook的安装与使用详解

    Jupyter Notebook的安装与使用 什么是Jupyter Notebook? Jupyter Notebook是一款基于Web的交互式计算环境,能够在浏览器中以交互式的形式编写和运行代码,并且可以在文档中穿插富媒体内容。 安装Jupyter Notebook 安装Jupyter Notebook需要先安装Python。以Windows系统为例,以下…

    C 2023年5月23日
    00
  • C语言实现循环链表

    实现循环链表,我们需要定义一个结构体来表示链表中的每个节点,其中包含一个指向下一个结点的指针。 下面是一个示例结构体的定义: struct Node { int data; struct Node* next; }; 其中,data表示节点存储的数据,next是指向下一个节点的指针。 我们需要定义以下操作来构建循环链表: 创建一个空链表 struct Nod…

    C 2023年5月23日
    00
  • Fate/EXTELLA启动应用程序错误怎么办 0xc000007b错误的解决方法

    Fate/EXTELLA启动应用程序错误解决方案 问题描述 当尝试启动Fate/EXTELLA游戏时,可能会出现以下错误: “无法启动应用程序程序,因为计算机上找不到XXX.dll。请尝试重新安装该程序以解决该问题。” “应用程序无法正确启动(0xc000007b)。单击确定关闭应用程序。” 如果你在运行Fate/EXTELLA时遇到以上错误,那么你所面临的…

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