C++ 中的Lambda表达式写法

当我们需要在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日

相关文章

  • Matlab图像如何处理?Matlab图像处理的基本操作

    Matlab是一种常用的图像处理软件,它集成了许多图像处理的工具箱和函数库。接下来,我将介绍Matlab图像处理的基本操作和处理流程,包括以下几个主要步骤:读取图像、显示图像、图像转换、滤波操作、二值化处理、边缘检测和图像输出。 1. 读取图像 使用Matlab处理图像首先要读取图像。Matlab支持读取各种类型的图像文件,例如jpeg,png等等。读取图像…

    C 2023年5月22日
    00
  • 特殊字符的json序列化总结大全

    首先来介绍一下“特殊字符的json序列化总结大全”的攻略。 特殊字符的json序列化总结大全 在进行json序列化时,一些特殊字符不会被直接转义,而是Unicode编码表示,在进行反序列化时要进行相应的转换。 1. 空字节 空字节是指二进制零值常见的表示方式,也是一些特殊字符的编码方式。空字节可以写作”\0″或者使用Ctrl+@或Ctrl+Shift+2组合…

    C 2023年5月23日
    00
  • golang实现sql结果集以json格式输出的方法

    对于”golang实现sql结果集以json格式输出的方法”,我会按照以下步骤进行详细讲解: 步骤一:连接数据库 首先,我们需要将Go程序连接到目标数据库,这个过程可以使用第三方的Go包来实现,例如 “github.com/go-sql-driver/mysql” 或 “github.com/lib/pq”。以下是一个使用MySQL数据库的示例: impor…

    C 2023年5月23日
    00
  • C语言中数据是如何存储在内存中的

    C语言中的数据类型和变量在内存中的存储方式是有一定规律的。首先,需要了解内存的分配方式和内存地址的概念。内存通常被分为多个“字节(byte)”来管理,每个字节大小为8位,每个字节都有一个唯一的内存地址,用来标记这个字节在计算机内存中的位置。 在C语言中,变量在定义时会被分配相应的内存空间,其大小取决于变量的数据类型。以下是不同数据类型在内存中占据的空间大小:…

    C 2023年5月23日
    00
  • VScode中C++头文件问题的终极解决方法详析

    下面是详细的攻略: VScode中C++头文件问题的终极解决方法详析 在使用VScode进行C++程序开发时,遇到头文件引用问题是非常常见的。本文将为大家介绍,在VScode中C++头文件问题的终极解决方法,以确保你在开发过程中能够顺畅地引用和编译代码。具体解决方法如下: 第一步:配置includePath 在VScode中,需要配置includePath,…

    C 2023年5月23日
    00
  • c++11中的noexcept关键字

    当在C++代码中使用noexcept关键字时,可以告诉编译器函数不会抛出任何异常。当使用noexcept关键字时,可以提高代码的性能和可靠性,因为在一些情况下,编译器可以使用更快、更简单的代码生成策略。 使用方法 noexcept可以用在函数声明和定义处。在声明时,使用noexcept关键字声明函数不会抛出任何异常。在定义时(函数体内),如果函数抛出异常,则…

    C 2023年5月23日
    00
  • C语言实现职工管理系统

    C语言实现职工管理系统完整攻略 1. 概述 C语言实现职工管理系统的主要目的是建立一个能够简单快速地管理职工信息的系统。该系统可以实现添加、删除、修改、查询职工信息等功能。 2. 设计思路 2.1 数据结构设计 我们可以使用如下的数据结构来存储职工信息: typedef struct Employee { int num; // 职工编号 char name…

    C 2023年5月23日
    00
  • C语言中的函数指针学习笔记

    现在为大家介绍一下“C语言中的函数指针学习笔记”的完整攻略。 什么是函数指针? 函数指针(Function Pointer)是指向函数的指针变量,也就是说,函数指针指向函数的入口地址。 函数指针的定义 函数指针的定义格式如下: typedef int (*func_ptr)(int, int); // func_ptr是一个函数指针类型 上面代码定义了一个名…

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