📜  c++中的lambda函数(1)

📅  最后修改于: 2023-12-03 15:29:53.748000             🧑  作者: Mango

C++中的Lambda函数介绍

Lambda函数是C++11中最重要的新特性之一,它允许程序员以一种简洁、灵活和安全的方式定义匿名函数。本文将介绍Lambda函数的基本语法、捕获列表和常见用法。

基本语法

Lambda函数遵循以下基本语法:

[capture list] (parameters) -> return_type { 
    // lambda function body
}

其中,方括号内是捕获列表,参数列表和函数体与普通函数定义相同。箭头后面是返回类型,可以省略,编译器会根据函数体自动推断。

以下是一个简单的Lambda函数示例:

auto sum = [](int x, int y) -> int {
    return x + y;
};

其中,Lambda函数“sum”接受两个整数参数,返回它们的和。

Lambda函数具有自己的作用域,可以访问其外部作用域的变量,也可以定义自己的局部变量。

捕获列表

捕获列表用于指定Lambda函数如何访问外部作用域的变量。

捕获列表有两种形式:

  • 值捕获:捕获外部作用域的变量,并将其作为Lambda函数的副本变量,该副本变量只能被Lambda函数修改。
  • 引用捕获:捕获外部作用域的变量,并将其作为Lambda函数的引用变量,该引用变量可以被Lambda函数修改和访问。

示例如下:

int x = 1;
int y = 2;
auto sum = [x, &y]() -> int {
    x = 10; // 修改副本变量,不影响外部变量
    y = 20; // 修改引用变量,影响外部变量
    return x + y;
};

Lambda函数“sum”以值捕获方式捕获变量“x”,以引用捕获方式捕获变量“y”。在函数体内,修改“x”只会修改副本变量的值,而修改“y”会同时修改外部变量的值。

常见用法
1. Lambda函数作为参数

Lambda函数可以作为其他函数的参数,例如STL中的算法函数、线程函数等。

以下是一个示例,使用Lambda函数对数组求和:

int a[] = {1, 2, 3, 4, 5};
int sum = accumulate(begin(a), end(a), 0, [](int x, int y) {
    return x + y;
});

其中,“accumulate()”函数接受一个数组、“0”作为初始值和一个Lambda函数作为参数,Lambda函数用于将相邻的数组元素相加。

2. Lambda函数作为返回值

Lambda函数也可以作为其他函数的返回值,这种方式非常有用,可以用于生成函数对象、闭包等。

以下是一个示例,使用Lambda函数生成一个计数器函数:

auto get_counter = []() -> function<int()> {
    int count = 0;
    return [&count]() -> int {
        return ++count;
    };
};

auto counter = get_counter();
cout << counter(); // 输出1
cout << counter(); // 输出2
cout << counter(); // 输出3

其中,“get_counter()”函数返回一个Lambda函数,“count”是该函数中的局部变量,而返回的Lambda函数通过引用捕获了“count”,实现了计数器的功能。

总结

Lambda函数是一种强大而灵活的语言特性,可用于许多应用程序。通过本文的介绍,您已经了解了Lambda函数的基本语法、捕获列表和常见用法。希望这对您有所帮助!