在现代C++中,Lambda表达式提供了定义匿名函数对象的能力,这在很多场合,如STL算法、线程构造函数、事件处理等,都非常有用。Lambda表达式使得函数定义更加灵活和简洁。
1. 基本语法
Lambda表达式的基本形式包括一个捕获列表、参数列表、返回类型(可选)和函数体。
#include <iostream>
void basicLambda() {
auto lambda = []() {
std::cout << "Hello, Lambda!" << std::endl;
};
lambda(); // 调用Lambda表达式
}
2. 捕获列表
捕获列表定义了Lambda表达式可以访问的外部变量,以及访问方式(值或引用)。
#include <iostream>
void captureLambda() {
int x = 10;
auto captureByValue = [x]() {
std::cout << "Capture by value: " << x << std::endl;
};
auto captureByReference = [&x]() {
std::cout << "Capture by reference: " << x << std::endl;
};
x = 20;
captureByValue(); // 输出10,因为是值捕获
captureByReference(); // 输出20,因为是引用捕获
}
3. 带参数的Lambda
Lambda表达式可以像普通函数一样接受参数。
#include <iostream>
void parameterLambda() {
auto add = [](int a, int b) {
return a + b;
};
std::cout << "3 + 4 = " << add(3, 4) << std::endl;
}
4. 指定返回类型
对于复杂的Lambda表达式,可能需要显式指定返回类型。
#include <iostream>
void returnTypeLambda() {
auto divide = [](double a, double b) -> double {
if(b == 0) return 0;
return a / b;
};
std::cout << "6 / 2 = " << divide(6, 2) << std::endl;
}
5. Lambda在STL算法中的应用
Lambda表达式常用于STL算法中,特别是那些需要回调函数的算法。
#include <algorithm>
#include <vector>
#include <iostream>
void stlLambda() {
std::vector<int> vec = {1, 2, 3, 4, 5};
std::for_each(vec.begin(), vec.end(), [](int x) {
std::cout << x << " ";
});
// 输出: 1 2 3 4 5
}
6. Lambda捕获成员变量
在类的成员函数中,可以使用Lambda捕获成员变量。
#include <iostream>
#include <vector>
#include <algorithm>
class LambdaInClass {
private:
std::vector<int> vec = {1, 2, 3, 4, 5};
public:
void print() {
std::for_each(vec.begin(), vec.end(), [this](int value) {
std::cout << value + this->offset << " ";
});
// 输出: 2 3 4 5 6
}
private:
int offset = 1;
};
void lambdaInClass() {
LambdaInClass obj;
obj.print();
}