当我们需要在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
总结
Lambda表达式是C++11的一个重要特性,它在C++中允许实现轻量级的、匿名的、可传递的、可执行的函数对象。通过捕获列表,Lambda表达式可以访问和操作外部变量,通过Lambda表达式,我们可以更加方便和简洁地实现一些算法和功能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 中的Lambda表达式写法 - Python技术站