lambda表达式是C++11标准新引入的功能,lambda能够很优雅简洁的定义匿名函数,可以很容易的并行化,但是它也不是没有缺点的,他的缺点就是代码可读性变差,不容易调试。在c++的一些场景中,我们可以使用lambda表达式来简单优雅的进行代码实现。
lambda表达式的格式如下:1
[capture list] (parameter list) -> return type {function body}
内容看着很多很复杂,但是并不是所有的都需要,必不可少的是capture list以及function body,如下所示1
auto f = [] {return value;}
参数分析
capture list
捕获列表里的参数来源于lambda所在的函数作用域中的局部变量
捕获列表可以是值捕获,也可以是引用捕获
值捕获的例子如下1
2
3size_t v = 42;
auto f = [v] () mutable {return ++v;};
cout << f() << " " << v << endl; // 输出为 42 43
引用捕获的例子如下1
2
3size_t v = 42;
auto f = [&v] {return ++v;};
cout << f() << " " << v << endl; // 输出结果为43 43
可变lambda
默认情况下,在lambda表达式中是不能改变捕获列表中的值拷贝变量的。如果要修改,要么是引用,要么是加mutable关键字1
2
3size_t v = 42;
auto f = [v] () mutable {return ++v;};
cout << f() << " " << v << endl; // 输出为 42 43
如果我们不想写,那么编译器会帮助我们默认的补充,不过我们需要指出我们是值捕获还是引用捕获,否则就是空捕获了。如下所示
[=] {}
[&] {}
如果我们什么都不写,则为空捕获,空捕获意味着不使用所在函数的变量
[]
parameter list
参数列表很容易理解,就是lambda表达式需要的参数
return type
需要指定lambda表达式的返回值类型
function body
函数体,lambda表达式的操作的具体的实现。
lambda表达式应用
在C++中,lambda表达式一般多应用于多线程,泛型算法等方面。
在泛型算法中,比如说sort,默认的排序规则是从小到大,如果我们需要从大到小呢?
1、使用函数1
2
3
4
5bool IsShorter(const string& s1, const string& s2)
{
return s1.size() > s2.size();
}
sort(words.begin(), words.end(), IsShorter);
2、使用内置模板函数1
sort(words.begin(), words.end(), greater<int>());
3、使用lambda表达式1
sort(words.begin(), words.end(), [](const string& s1, const string& s2) {return s1 > s2})