Lambda表达式(附有案例)
Lambda表达式
Lambda表达式是C++11引入的一种函数对象(函数式编程)的语法扩展。它可以用于创建匿名的、临时的函数对象,并可以在需要函数对象的地方直接使用,而无需单独定义一个函数或函数对象类。
Lambda表达式的基本语法如下:
[capture list](parameters) -> return_type {
// 函数体
}
其中,各部分的含义如下:
capture list
:捕获列表,用于指定外部变量的访问方式。可以省略,表示不捕获任何外部变量;也可以采用值捕获、引用捕获或混合捕获的方式捕获外部变量。parameters
:参数列表,与普通函数的参数列表相似。可以省略,表示无参数。-> return_type
:返回类型,表示Lambda表达式的返回类型。可以省略,根据函数体中的返回语句自动推导返回类型。{}
:函数体,包含实际的执行逻辑。
Lambda表达式还有两种特殊形式:
- 表达式形式:当Lambda表达式只包含单个表达式时,可以省略
{}
和返回类型声明,直接通过表达式的结果进行返回。例如:[capture list](parameters) { return expression; }
。 - 语句形式:当Lambda表达式包含多个语句时,需要使用
{}
包围,并通过显式的return
语句指定返回值。例如:[capture list](parameters) { statements; return expression; }
。
Lambda表达式主要用于以下几个方面:
- 作为函数对象(函数指针)的替代:可以将Lambda表达式作为参数传递给函数,用于回调或算法中。
- 简化代码:Lambda表达式可以直接在需要函数对象的地方定义和使用,避免了额外的函数定义和命名。
- 支持函数式编程:通过Lambda表达式,可以更方便地进行函数式编程的操作,如map、reduce、filter等。
在给定的代码示例中,Lambda表达式用于连接每个QClickLabel
的clicked
信号与槽函数。它捕获了row
、column
和colorList
这些外部变量,并在点击时通过调用NotifyManager::getInstance()->notifyOtherWindowChangeSkin()
函数通知其他窗口改变皮肤颜色。Lambda表达式省略了返回类型声明,通过表达式的结果自动推导返回类型。
例子,演示了Lambda表达式的用法:
以下是一个简单的例子,演示了Lambda表达式的用法:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> numbers = {5, 2, 8, 3, 1};
// 使用Lambda表达式排序
std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
return a < b;
});
// 使用Lambda表达式打印每个元素
std::for_each(numbers.begin(), numbers.end(), [](int num) {
std::cout << num << " ";
});
return 0;
}
在上述代码中,首先定义了一个整数向量numbers
,其中包含一些整数。
然后,使用std::sort()
算法对numbers
进行排序。这里使用了一个Lambda表达式作为第三个参数,指定了排序的规则:如果a
小于b
,则返回true
,否则返回false
。Lambda表达式的参数列表为两个整数类型的参数a
和b
,省略了返回类型声明,通过表达式的结果自动推导返回类型。
接下来,使用std::for_each()
算法遍历numbers
,并使用Lambda表达式打印每个元素。Lambda表达式的参数列表为一个整数类型的参数num
,通过std::cout
输出该参数的值。
运行以上代码,会将排序后的数字依次输出到控制台,结果为:1 2 3 5 8。
这个例子展示了Lambda表达式的两个常见应用场景:作为算法的参数传递,以及简化代码书写。通过Lambda表达式,可以在需要函数对象的地方直接定义和使用匿名的、临时的函数对象。