关于“详解C++11中的lambda匿名函数”的完整攻略,我将分以下几个方面展开:
一、什么是lambda表达式?
lambda表达式是C++11标准中引入的新特性,它是一个匿名函数,可以在需要函数的地方直接定义函数并执行。
通常情况下,函数都需要在定义后才能被调用,而lambda表达式可以直接定义后立即执行。它非常方便,在一些场景下(如STL算法、函数式编程等)可以替代传统的函数调用方式。
二、lambda表达式语法
lambda表达式的语法非常简洁明了,如下所示:
[capture list] (parameters) -> return type { function body }
capture list
:包含零个或多个捕获列表的方括号[]
。如果没有需要捕获的变量,可以留空。捕获列表用于指定lambda函数能够访问的外部变量。parameters
:函数参数列表,和正常的函数定义一样,可以为空。return type
:函数返回值类型,可以省略,编译器会自动根据函数体中的返回语句进行推导。function body
:函数体,包含在花括号{}
中,可以包含任意数量的语句。
下面是一个简单的示例,使用lambda表达式定义一个函数对象并调用:
auto hello = []() { std::cout << "Hello, world!" << std::endl; };
hello(); // output: Hello, world!
这里我们使用auto
关键字自动推导hello
对象的类型,它是一个函数对象类型。使用()
调用函数对象,输出了Hello, world!
字符串。
三、lambda表达式的捕获列表
在前面的语法中,我们提到了lambda表达式的捕获列表,它用于指定lambda函数能够访问的外部变量。捕获列表的语法有三种:
1. 按值捕获
int a = 10;
auto func = [a]() { std::cout << "a = " << a << std::endl; };
a = 20;
func(); // output: a = 10
这里的[a]
表示按值捕获变量a
,即lambda表达式在定义时会把a
的值复制一份,之后再使用。因此在修改a
的值后调用func()
对象时,输出的值仍然是10。
2. 按引用捕获
int b = 100;
auto func = [&b]() { std::cout << "b = " << b << std::endl; };
b = 200;
func(); // output: b = 200
这里的[&b]
表示按引用捕获变量b
,即lambda表达式在定义时会引用b
的地址,之后再使用。因此在修改b
的值后调用func()
对象时,输出的值也会被更新。
3. 按引用捕获,并保持只读
int c = 1000;
auto func = [&c]() { std::cout << "c = " << c << std::endl; };
c = 2000;
func(); // output: c = 2000
这里的[&c]
表示按引用捕获变量c
,同时添加const
限定符,使其只读不可修改。因此在修改c
的值后调用func()
对象时,输出的值还是之前的值1000。
四、lambda表达式的应用
lambda表达式在STL算法、函数式编程等场景下有广泛的应用。下面是两个示例:
1. 使用STL算法和lambda表达式实现排序
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 3, 2, 5, 4};
std::sort(vec.begin(), vec.end(), [](int a, int b) { return a < b; });
for (auto i : vec) std::cout << i << " "; // output: 1 2 3 4 5
return 0;
}
这里调用了std::sort
算法,使用lambda表达式定义了排序规则(从小到大排列),实现了对整个vector的排序功能。
2. 使用lambda表达式实现函数式编程
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
std::vector<int> result;
std::transform(vec.begin(), vec.end(), std::back_inserter(result),
[](int i) { return i * i; });
for (auto i : result) std::cout << i << " "; // output: 1 4 9 16 25
return 0;
}
这里调用了std::transform
算法,使用lambda表达式定义了变换规则(对每个元素求平方),实现了函数式编程中的map功能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解C++11中的lambda匿名函数 - Python技术站