提示:本博客作为学习笔记,有错误的地方希望指正。
文章目录
- 一、概述
- 二、基本语法
- 三、示例
- 3.1、不捕获任何外部变量
- 3.2、 按值捕获外部变量
- 3.3、按引用捕获外部变量
- 3.4、捕获所有外部变量
- 3.5、捕获 this 指针
- 四、应用场景
- 4.1、使用 Lambda 表达式作为线程函数
一、概述
C++ 中的 lambda 表达式是一种内联定义的小型匿名函数,可以用于各种需要函数对象的场合。lambda 表达式提供了一种简洁的方式来定义和使用函数对象,特别适用于需要临时定义函数的情况,如回调函数、排序算法中的比较函数等。
二、基本语法
lambda 表达式的基本语法如下:
[capture-list] (parameter-list) -> return-type { function-body }
- capture-list:捕获列表,用于捕获外部变量。
- parameter-list:参数列表,定义函数的参数。
- return-type:返回类型,可选,如果省略,编译器会自动推断返回类型。
- function-body:函数体,包含具体的逻辑。
捕获列表
捕获列表用于将外部变量捕获到 lambda 表达式中。常见的捕获方式有:
- []:不捕获任何外部变量。
- [=]:按值捕获所有外部变量。
- [&]:按引用捕获所有外部变量。
- [var]:按值捕获特定变量 var。
- [&var]:按引用捕获特定变量 var。
- [this]:捕获当前对象的 this 指针。
三、示例
3.1、不捕获任何外部变量
auto 关键字用于自动类型推断,可以简化变量声明和初始化的过程。auto 关键字告诉编译器根据初始化表达式来推断变量的类型。这不仅使代码更简洁,还减少了手动指定类型时可能出现的错误。
#include <iostream>
int main()
{auto lambda = []() {std::cout << "hello world" << std::endl;};lambda(); // 调用 lambda 表达式return 0;
}
3.2、 按值捕获外部变量
int main ()
{int value = 42;auto lambda = [value](){std::cout << "captured value : " << value << std::endl;};lambda(); // 调用 lambda 表达式return 0;
}
3.3、按引用捕获外部变量
#include <iostream>int main() {int value = 42;auto lambda = [&value]() {value += 10;std::cout << "Modified value: " << value << std::endl;};lambda(); // 调用 lambda 表达式std::cout << "Final value: " << value << std::endl;return 0;
}
3.4、捕获所有外部变量
#include <iostream>int main() {int value1 = 42;int value2 = 100;auto lambda = [=]() {std::cout << "Value1: " << value1 << ", Value2: " << value2 << std::endl;};lambda(); // 调用 lambda 表达式return 0;
}
3.5、捕获 this 指针
class Myclass
{public:int value;Myclass(int val) : value(val){}void printValue() {auto lambda = [this]() {std::cout << "Value : " << value << std::endl;};lambda();}
};int main()
{Myclass obj(42);obj.printValue();return 0;
}
四、应用场景
- 回调函数
在事件驱动编程中,lambda 表达式常用于定义回调函数。 - 标准库算法:
在使用标准库算法(如 std::sort、std::for_each 等)时,lambda 表达式可以作为比较函数或操作函数。 - 线程函数:
在多线程编程中,lambda 表达式可以作为线程函数。
4.1、使用 Lambda 表达式作为线程函数
#include <iostream>
#include <thread>void createThreadWithLambda() {int value = 42;// 定义一个 lambda 表达式作为线程函数auto threadFunction = [value]() {std::cout << "Thread function: Value = " << value << std::endl;};// 创建线程std::thread t(threadFunction);// 等待线程结束t.join();
}int main() {createThreadWithLambda();return 0;
}