在新出的C++11的新特性中新增了Lambda表达式,Lambda表达式是一种简洁的方式来创建匿名函数,通常用于需要一个函数,函数也比较简单,只需要一行代码来定义。Lambda表达式可以在不需要定义命名函数的情况下直接创建一个函数对象。使用非常方便,不需要再去声明和定义函数。
在C++中Lambda表达式的语法形式为:[capture](parameters) -> return_type { body }
解析如下:
capture
:捕获外部变量的列表,可以通过值或引用捕获。parameters
:参数列表,与普通函数的参数列表相同。return_type
:返回类型(可以省略,编译器会自动推导)。body
:函数体,包含要执行的代码。
举一个简单的栗子:
int main()
{
auto add = [](int x, int y) -> int
{
return x + y;
};
int result = add(3, 5);
std::cout << "Result: " << result << std::endl; // 输出:Result: 8
return 0;
}
在这个栗子中,[](int x, int y) -> int { return x + y; }
定义了一个lambda表达式,捕获列表为空,参数为 int x
和 int y
,返回类型为 int
。这个lambda表达式被赋值给变量 add
,然后调用 add(3, 5)
来计算 3 + 5
的结果。
捕获外部变量的栗子:
int main()
{
int a = 5;
int b = 3;
auto add = [a, b]() -> int
{
return a + b;
};
std::cout << "Result: " << add() << std::endl; // 输出:Result: 8
return 0;
}
在这个栗子中,lambda表达式通过捕获列表 [a, b]
捕获了外部变量 a
和 b
,然后在函数体内使用这两个变量。
捕获外部变量并修改的栗子:
如果需要在lambda表达式中修改捕获的外部变量,可以通过引用捕获
#include <iostream>
int main()
{
int a = 5;
auto increment = [&a]()
{
a++;
};
increment();
std::cout << "a: " << a << std::endl; // 输出:a: 6
return 0;
}
在这个栗子中,lambda表达式通过捕获列表 [&a]
通过引用捕获变量 a
,因此在lambda表达式中对 a
的修改会影响到外部的 a
。
在STL算法中使用Lambda表达式
lambda表达式在STL算法中非常有用,例如 std::sort
:
int main()
{ std::vector<int> vec = {5, 2, 8, 1, 3};
std::sort(vec.begin(), vec.end(), [](int a, int b)
{ return a < b; });
for (int n : vec)
{ std::cout << n << ' '; }
// 输出:1 2 3 5 8
return 0; }
在这个栗子中,Lambda表达式 [](int a, int b) { return a < b; }
被用作 std::sort
函数的比较函数,用于对向量进行升序排序。
这些栗子展示了C++中Lambda表达式的基本用法,以及如何在不同的场景中应用它们,希望对大家有所帮助。