auto 类型与 Lambda 表达式使用笔记

由 hycqwq 发布

本文所有内容均仅能在 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 类型来存储。


暂无评论

发表评论