一、lambda匿名函数
所谓匿名函数,简单地理解就是没有名称的函数,又常被称为 lambda 函数或者 lambda 表达式。
继 Python、Java、C#、PHP 等众多高级编程语言都支持 lambda 匿名函数后,C++11 标准终于引入了 lambda,本节将带领大家系统地学习 lambda 表达式的具体用法。
定义lambda函数的语法格式如下:
[外部变量访问方式说明符] (参数) mutable -> 返回值类型
{
函数体
}
先看一些比较简单的示例:
[]{
std::cout << "hello lambda" << std::endl;
};
[]{
std::cout << "hello lambda" << std::endl;
}();
注意看第一个和第二个 第一个lambda函数没有实际用处 第二个多了一个() 表示调用了该匿名函数
auto I = []{
std::cout << "hello lambda" << std::endl;
};
I(); //调用了该匿名函数
auto I = ... 表示给lambda函数取什么昵称 方便后续调用
完整形式为 [...](...) mutable throwSpec -> retType {};
1.[...]叫作导入的符号 看到它就知道是lambda表达式了
2.(...)表示参数 因为lambda的行为像函数一样 当然就可以有参数了
3.mutable表示[...]中的数据可不可以被改写
4.throwspec 表示是否可以丢出异常
5.retType 描述lambda的返回类型
6.其中 mutable throwspec retType都是可选的 也可以不写 但只要有一个存在 就需要写()
7.[]中可以填 = 或 &, = 表示传值的方式 &表示传地址符号的方式 相当于取别名
示例一:
#include<iostream>
int main()
{
int id = 0;
auto f = [id]() mutable {
std::cout << "id = " << id << std::endl;
++id;
};
id = 42;
f();
f();
f();
std::cout << id << std::endl;
return 0;
}
1.[id]表示 取外部的变量id
2.()表示lambda函数没有参数
3.有mutable 表示对值传入外参id可以改变
{...} 表示函数体里面的动作
其实这个匿名函数相当于是一个类
class Functor
{
private:
int id;
public:
void operator()(){
std::cout << "id = " << id << std::endl;
++id;
}
};
Functor f;
f();
这个类中重载了() 所以对象就可以像函数一样调用
为什么打印结果是 0 1 2 42
把这个匿名函数当作Functor类一样去理解 它有一个传入[id] 等价于值传递 且 id = 0 相当于有一个属于自己'对象'的id,对这个id进行++; 所以分别是 0 1 2
示例二:
#include<iostream>
int main()
{
int id = 0;
auto f = [&id](int param)
{
std::cout << "id = " << id << std::endl;
++id;
++param;
};
id = 42;
f(7);
f(7);
f(7);
std::cout << id << std::endl;
return 0;
}
注意这里是[&id] 所以对id做出改变 再调用匿名函数时 不同于值传递 此时对打印结果有改变的
示例三:
#include<iostream>
int main()
{
int id = 0;
auto f = [id](){
std::cout << "id = " << id << std::endl;
//++id; //因为是值传递 所以不能对外部参数做改变 没有加 mutable 时故编译器会报错
};
id = 42;
f();
f();
f();
std::cout << id << std::endl;
return 0;
}
匿名函数没有加mutable 所以对值传入的外参id修改时 会报错
以上就是lambda匿名函数的用法详解,谢谢大家!!!