文章

C++的lambda表达式

lambda是匿名函数。

C++的lambda表达式

lambda

lambda表达式是C++11引入的新特性,它是一种匿名函数,具有简洁、高效和功能强大的特点,通常用于简化代码,尤其是在处理临时或小型回调函数时。

语法:

1
[捕获列表](形式参数) ->返回类型 { 函数体 }

捕获列表(capture list),用于捕获 lambda 表达式外部范围内的变量,逗号分隔。变量可以按值捕获(=)或按引用捕获(&)。

形式参数,同普通函数的形参。

返回类型(return type),用于指明返回值类型,void、int、std::string等。

函数体,同普通函数的函数体。

捕获列表

[] 不捕获任何变量;
[=] 按值捕获所有变量,按值捕获的变量不允许修改;
[&] 按引用捕获所有变量;
[a] 仅以值捕获a,其它变量不捕获;
[&a] 仅按引用捕获a,其它变量不捕获;
[a, b] 仅以值捕获a和b,其它变量不捕获;
[a, &b] 按值捕获a,以引用捕获b,其它变量不捕获;
[&a, &b]
[=, &a]
[&, a]
[&, a, b] 以引用捕获所有变量,但是a和b除外,它们通过值捕获;
[this] 通过引用捕获当前对象(其实是复制指针);
[*this] 按值捕获当前对象。

mutable

mutable关键字,可以使lambda表达式修改按值捕获的变量。这里的修改是改变lambda中按值捕获的局部变量,不会影响原始变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>

int main()
{
    int x = 5;
    // [x](){ x = 7; };  // error
    auto lambda = [x]() mutable { 
        x++;
        std::cout << "x: "<< x << std::endl;
    };
    lambda();  // x: 6
    lambda();  // x: 7
    std::cout << "x: "<< x << std::endl;  // x: 5
    return 0;
}

最简单的lambda

lambda表达式由 [](){} 构成。没有形参时,可以省略 ()

1
2
3
4
5
int main()
{
    []{};  // 什么都不做
    return 0;
}

lambda做函数参数

lambda做函数参数,其实就是函数做为参数,只不过这里的函数是匿名函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <vector>

void ForEach1(std::vector<int>& values, void(*func)(int))
{
    for(int v : values)
        func(v);
}

#include <functional>
void ForEach2(std::vector<int>& values, const std::function<void(int)>& func)
{
    for(int v : values)
        func(v);
}

int main()
{
    std::vector<int> values = {1, 2, 5, 4, 3};

    ForEach1(values, [](int v){ std::cout << v << std::endl;});

    ForEach2(values, [=](int v){ std::cout << "v: " << v << std::endl;});
    return 0;
}
本文由作者按照 CC BY 4.0 进行授权