C++使用Lambda表达式实例讲解(C++ Lambda表达式实战教程:实例详解与应用)
原创
一、Lambda表达式简介
Lambda表达式是C++11引入的一种简洁的匿名函数编写做法,它允许我们在需要函数对象的地方敏捷定义一个函数。Lambda表达式在编写代码时可以带来更高的灵活性和简洁性,尤其是在编写回调函数、线程函数或作为算法的参数时。
二、Lambda表达式的基本语法
Lambda表达式的基本语法如下:
[捕获列表](参数列表) mutable -> 返回类型 {
// 函数体
}
其中,捕获列表和参数列表是可选的,返回类型也可以省略(由编译器自动推导)。
三、Lambda表达式实例详解
下面通过一些实例来详细讲解Lambda表达式的使用。
3.1 无参数Lambda表达式
一个无参数的Lambda表达式示例:
auto lambda = []() {
return "Hello, Lambda!";
};
std::cout << lambda() << std::endl; // 输出:Hello, Lambda!
3.2 带参数的Lambda表达式
一个带参数的Lambda表达式示例:
auto add = [](int a, int b) {
return a + b;
};
std::cout << add(3, 4) << std::endl; // 输出:7
3.3 捕获列表的使用
捕获列表用于从外部作用域捕获变量。以下是几个捕获列表的示例:
3.3.1 值捕获
值捕获会在Lambda表达式被定义时,以值的做法捕获外部变量:
int value = 5;
auto lambda = [value]() {
return value;
};
std::cout << lambda() << std::endl; // 输出:5
3.3.2 引用捕获
引用捕获会捕获外部变量的引用:
int value = 5;
auto lambda = [&value]() {
return ++value;
};
std::cout << lambda() << std::endl; // 输出:6
std::cout << value << std::endl; // 输出:6
3.3.3 隐式捕获
隐式捕获允许编译器自动判断捕获列表中应该捕获哪些变量。可以使用[=]即值捕获,使用[&]即引用捕获:
int value = 5;
auto lambda = [=]() {
return value;
};
std::cout << lambda() << std::endl; // 输出:5
int another = 10;
auto lambdaRef = [&]() {
return ++another;
};
std::cout << lambdaRef() << std::endl; // 输出:11
3.4 mutable修饰符
默认情况下,Lambda表达式中的捕获列表中的变量是const的,如果需要修改这些变量,可以使用mutable修饰符:
int value = 5;
auto lambda = [value]() mutable {
return ++value;
};
std::cout << lambda() << std::endl; // 输出:6
std::cout << value << std::endl; // 输出:5
3.5 返回类型自动推导
如果Lambda表达式的函数体只有一行,返回类型可以省略,编译器会自动推导返回类型:
auto lambda = [](int a, int b) {
return a + b;
};
std::cout << lambda(3, 4) << std::endl; // 输出:7
四、Lambda表达式应用场景
下面是一些Lambda表达式在实际编程中的应用场景。
4.1 使用STL算法
Lambda表达式频繁与STL算法一起使用,比如sort、find_if等。以下是一个使用Lambda表达式和sort算法对vector排序的例子:
std::vector
vec = {3, 1, 4, 1, 5, 9}; std::sort(vec.begin(), vec.end(), [](int a, int b) {
return a < b;
});
4.2 作为函数对象传递
Lambda表达式可以作为函数对象传递给其他函数,以下是一个例子:
void printLambda(std::function
func) { func();
}
int value = 5;
printLambda([value]() {
std::cout << value << std::endl;
}); // 输出:5
4.3 作为线程函数
Lambda表达式也常用于创建线程,以下是一个例子:
#include <thread>
int value = 5;
std::thread t([value]() {
std::cout << value << std::endl;
});
t.join(); // 输出:5
五、总结
Lambda表达式为C++编程带来了更高的灵活性和简洁性。通过上面的实例,我们可以看到Lambda表达式在多种场景下的应用。合理使用Lambda表达式可以使代码更加清晰可见、简洁,同时节约编程高效能。