本文所有内容均仅能在 C++11 及以上标准中使用。
一、前置知识
1.1 auto 类型
auto 的本义是“自己”。
auto 类型可以根据赋值,自己推断应该使用什么类型。这其实是为了方便程序猿不用打一些很长的类型。举个栗子,遍历一个 map,如果不用 auto,代码如下。
map<class1, class2> m;
for (map<class1, class2>::iterator i = m.begin(); i != m.end(); i++)
cout << (*i).first << " " << (*i).second << endl;
而如果使用 auto,就只需要将 map<class1, class2>::iterator
改为 auto
就好了,代码简洁了好多。
另外,for + auto 还有一种针对 STL 的遍历方法:
map<class1, class2> m;
for (auto i : m)
cout << i.first << " " << i.second << endl;
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<int, int> m;
m[114514] = 1919810;
m[1919810] = 114514;
m[1919] = 810;
m[114] = 514;
for (map<int, int>::iterator i = m.begin(); i != m.end(); i++)
cout << (*i).first << " " << (*i).second << endl;
for (auto i = m.begin(); i != m.end(); i++)
cout << (*i).first << " " << (*i).second << endl;
for (auto i : m)
cout << i.first << " " << i.second << endl;
return 0;
}
以上代码的运行结果为:
114 514
1919 810
114514 1919810
1919810 114514
114 514
1919 810
114514 1919810
1919810 114514
114 514
1919 810
114514 1919810
1919810 114514
二、Lambda 表达式
2.1 语法
[]() -> class {}
这就是一个 Lambda 表达式,这个函数不能访问外界变量(全局也不行),没有参数,也没有操作。接下来我一个个来分解。
2.1.1 能否访问外界变量
在 []
中填入你想让函数可以访问的变量,这些变量只能传引用,以参数形式传入。
[&x](){}
这就是可以让函数访问变量 $x$ 的 Lambda 表达式。
另外,如果想让函数访问当前作用域中所有的变量的话,直接填入一个等号即可。
[=]() -> class {}
2.1.2 参数
参数填在 ()
中,与普通函数格式一致。
[](int x) -> class {}
2.1.3 返回值类型
与定义函数时不同,返回值类型写在 ->
后,即 class
的位置。
[](int x) -> int {}
以上代码是一个返回值类型为 int
的 Lambda 表达式。
由于一般情况下编译器都可以自己判断返回值类型,所以一般可以省略 -> class
。
2.1.4 主体
主体代码填在 {}
中,与普通函数格式一致,注意一定要打分号。
[](int x) -> int {return x * 114514;}
2.1.5 存储
作为一个函数,Lambda 表达式是没有自己的标识符的,所以就只能用上面说过的 auto 类型来存储。