下面是浅谈C++11新引入的lambda表达式的攻略:
什么是lambda表达式
在C++11中,lambda表达式是一种定义匿名函数的方式,它能够将函数作为一等公民来处理。这意味着我们可以在运行时创建函数,将其作为参数传递,并在需要时立即执行。lambda表达式非常灵活,可用于几乎所有需要函数的场景,例如算法、STL容器、并发编程等等。
下面是一个简单的lambda表达式的例子:
auto func = [](int x, int y) { return x + y; };
int result = func(2, 3); // result = 5
这个lambda表达式接受两个整数参数x和y,并返回它们的和。我们可以将其定义为变量func,并像常规函数一样调用它。
lambda表达式的语法
lambda表达式的语法由三个部分组成:[]、参数列表和函数体。
下面是lambda表达式的通用格式:
[capture list] (parameters) mutable(optional) exception->return_type{ function body }
其中,[capture list]、(parameters)、mutable(optional)、exception、->return_type和{function body}都是lambda表达式的组成部分,具体含义将在下面详细介绍。
lambda表达式的使用示例
示例1:将lambda表达式用作算法的参数
Lambda表达式通常用于算法,例如std::sort和std::for_each等。下面是一个使用lambda表达式的std::sort的例子,该lambda表达式将vector中的元素按升序排序:
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec{5, 2, 8, 1, 7, 3, 9, 4, 6};
std::sort(vec.begin(), vec.end(),
[](int x, int y) { return x < y; });
for (int i : vec) {
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
示例2:使用lambda表达式在STL容器中查找元素
在STL容器中查找元素是另一个使用lambda表达式的常见场景,例如std::find_if函数。下面是一个使用lambda表达式查找vector中第一个偶数的例子:
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec{5, 2, 8, 1, 7, 3, 9, 4, 6};
auto it = std::find_if(vec.begin(), vec.end(),
[](int x) { return x % 2 == 0; });
if (it != vec.end()) {
std::cout << "The first even number is: " << *it << std::endl;
}
return 0;
}
在lambda表达式中,我们传递了一个整数参数x,并返回它是否是偶数。std::find_if函数将该lambda表达式应用于vector中的每个元素,直到找到第一个返回true的元素为止。
lambda表达式的组成部分详解
1. Capture List
[]是lambda表达式的第一部分,它指定了lambda表达式访问外部变量的方式。一个lambda表达式可能或可能不会访问外部变量。当它没有访问外部变量时,[]部分可以省略。否则,[]部分必须存在。
Capture List有三种合法的形式:
- []:不访问任何外部变量
- [x, &y]:x是以值传递的方式捕获的变量,y是以引用传递的方式捕获的变量。
- [&]:以引用传递的方式捕获所有外部变量
- [=]:以值传递的方式捕获所有外部变量
下面是一个例子,演示如何使用lambda表达式访问外部变量:
#include <iostream>
int main() {
int x = 0;
auto func = [&x]() { return ++x; };
std::cout << func() << std::endl; // 1
std::cout << func() << std::endl; // 2
std::cout << func() << std::endl; // 3
return 0;
}
这个lambda表达式以引用的方式捕获了变量x,并返回它的值加1。每次调用这个lambda表达式时,x的值都会递增。
2. Parameters
参数列表是lambda表达式的第二部分,它规定了lambda表达式的参数。与常规函数一样,参数列表可以为空或包含多个参数。如果需要,可以在参数列表中使用默认参数值。
下面是一个带参数的lambda表达式的例子:
auto func = [](int x, int y) { return x + y; };
int result = func(2, 3); // result = 5
该lambda表达式接受两个整数参数x和y,并返回它们的和。
3. Function Body
函数体是lambda表达式的最后一部分,它规定lambda表达式的行为。与常规函数一样,函数体可以是一个语句块,也可以是一个单独的语句。如果函数体包含多个语句,则可以使用花括号将它们括起来。
下面是一个带多个语句的lambda表达式的例子:
auto func = [](int x, int y) {
int sum = x + y;
std::cout << "The sum of " << x << " and " << y << " is " << sum
<< std::endl;
return sum;
};
int result = func(2, 3); // The sum of 2 and 3 is 5
该lambda表达式接受两个整数参数x和y,计算它们的和,并打印和。然后,它返回和的值。
4. Mutable
mutable是一个可选项,用于控制lambda表达式是否能够修改其捕获的外部变量。如果使用了mutable关键字,则lambda表达式可以在其内部修改值传递的外部变量。
下面是一个例子,演示如何使用mutable关键字:
#include <iostream>
int main() {
int x = 0;
auto func = [x]() mutable {
++x;
return x;
};
std::cout << func() << std::endl; // 1
std::cout << func() << std::endl; // 2
std::cout << func() << std::endl; // 3
return 0;
}
这个lambda表达式以值传递的方式捕获了变量x,并在其内部递增它的值。由于使用了mutable关键字,lambda表达式可以修改其捕获的外部变量。
5. Return Type
lambda表达式可以自动推断其返回类型,也可以明确指定返回类型。如果函数体只包含一个return语句,那么lambda表达式将自动推断返回类型,否则必须明确指定返回类型。
下面是一个例子,演示如何指定lambda表达式的返回类型:
#include <iostream>
int main() {
auto func1 = [](int x, int y) { return x + y; };
auto func2 = [](int x, int y) -> int { return x + y; };
std::cout << func1(2, 3) << std::endl; // 5
std::cout << func2(2, 3) << std::endl; // 5
return 0;
}
这两个lambda表达式都接受两个整数参数x和y,并返回它们的和。func1使用了自动推断返回类型,而func2明确指定了返回类型为int。
总结
以上就是我们对C++11新引入的lambda表达式的详细介绍,从基本概念、使用示例以及组成部分等方面进行了介绍。通过lambda表达式,我们可以更方便地处理函数,完成业务逻辑,提高代码可读性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈C++11新引入的lambda表达式 - Python技术站