📜  c++ lambda - C++ (1)

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

C++ Lambda

在程序设计中,Lambda表达式是一种便捷的、匿名函数的写法,允许我们在需要函数对象的地方使用一个临时的、匿名的函数。相比传统的函数指针,lambda表达式更加灵活、易于使用。

Lambda表达式的基本语法

Lambda表达式的基本语法如下:

[capture-list] (parameters) -> return-type { function-body }
  • capture-list 指定用于捕获变量的列表。这个列表被放置在方括号中,并用逗号分隔。注意,这个选项是可选的,如果lambda表达式不需要捕获变量,则可以省略这个选项;
  • parameters 指定函数参数列表,即你期望在lambda函数中使用的参数;
  • return-type 指定返回值类型;
  • function-body 指定实际的函数体。

下面是一个简单的例子,它使用lambda表达式打印“Hello, world!”:

auto hello = []() {
    std::cout << "Hello, world!" << std::endl;
};

hello();

这个例子中,我们使用[]来指定不需要捕获任何变量,()``表示接受0个参数,-> void说明函数不返回任何东西,而{}`里面是要执行的代码。

捕获变量

Lambda表达式的一个特点是能够捕获定义在本地作用域中的变量。这意味着你可以访问函数外部定义的变量,并在lambda表达式中进行操作。

捕获变量有两种方式:通过值传递和通过引用传递。使用[]可以指定捕获方式。例如:

int x = 10;
auto f1 = [x]() {
    std::cout << "x = " << x << std::endl;
};

auto f2 = [&x]() {
    x++;
};

f1();
f2();
std::cout << "new x = " << x << std::endl;

这个例子中,我们定义了两个lambda表达式,一个通过值传递捕获了变量x,而另一个通过引用传递捕获了变量x。在调用f1函数时,我们能够输出x的值,而在调用f2函数时,我们修改了x的值,并在后面输出了这个新的值。

标准库中的lambda表达式

标准库中的一些算法函数(如std::sort()std::transform()等)在C++11中已经支持lambda表达式。这意味着你可以用lambda表达式来指定这些函数在执行时所需的函数操作。

例如,下面的代码使用lambda表达式对一个整数向量进行排序:

std::vector<int> my_vector = { 4, 8, 1, 3, 9, 7 };

std::sort(my_vector.begin(), my_vector.end(), [](int a, int b) {
    return a < b;
});

for (auto i : my_vector) {
    std::cout << i << " ";
}

这个例子中,我们使用std::sort()函数对一个整数向量进行排序。在第三个参数中,我们使用lambda表达式来指定如何进行排序,即以a < b为比较条件进行排序。

总结

Lambda表达式在C++11中被引入,它是一种便捷的、匿名函数的写法,能够帮助程序员更加灵活、方便地处理函数对象。除了基本语法之外,我们还可以使用捕获变量、标准库等特性来增强lambda表达式的功能。