lambda表达式

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
3
size_t v = 42;
auto f = [v] () mutable {return ++v;};
cout << f() << " " << v << endl; // 输出为 42 43

引用捕获的例子如下

1
2
3
size_t v = 42;
auto f = [&v] {return ++v;};
cout << f() << " " << v << endl; // 输出结果为43 43

可变lambda

默认情况下,在lambda表达式中是不能改变捕获列表中的值拷贝变量的。如果要修改,要么是引用,要么是加mutable关键字

1
2
3
size_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
5
bool 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})

显示 Gitment 评论