C++:lambda匿名函数
匿名函数,可以理解为没有名字的函数
语法格式:
[外部变量访问方式说明符](参数)mutable->返回值类型
{函数体;
};
这其中有一些注意:
1.[ ]不可省略,内部表明函数体中可以使用哪些外部变量
2.()和参数在不需要参数时可一起省略
3.mutable可省略,但要是使用的话()不能省略,对于以值传递方式引入的外部变量,若无mutable则不允许修改(此方式修改的并不是真正外部变量的值)
4.若函数体内只有一个return语句或者返回值类型为void,则 ->返回值类型 可以省略
外部变量格式 | 功能 |
---|---|
[ ] | 空括号表示当前 lambda 匿名函数中不导入任何外部变量 |
[=] | 只有一个 = 等号,表示以值传递的方式导入所有外部变量 |
[&] | 只有一个 & 符号,表示以引用传递的方式导入所有外部变量 |
[val1,val2,...] | 表示以值传递的方式导入 val1、val2 等指定的外部变量,多个变量之间没有先后次序 |
[&val1,&val2,...] | 表示以引用传递的方式导入 val1、val2 等指定的外部变量,多个变量之间没有先后次序 |
[val,&val2,...] | 值传递和引用传递混合使用,变量之间没有先后次序 |
[=,&val1,...] | 表示除 val1 以引用传递的方式导入外,其它外部变量都以值传递的方式导入 |
[this] | 表示以值传递的方式导入当前的 this 指针 |
以代码为例:
#include<iostream>
using namespace std;int main()
{int a = 10;int b = 20;auto pfun = []{cout << "AA" << endl; };auto pfun = [=]()->int {return a + b; };//外部的a,b复制进来auto pfun = [=]()mutable->int {a = 100; b = 200; return a + b; };//外部a b都不改auto pfun = [&]()->int {a = 100; b = 200; return a + b; };//外部a b值都改auto pfun = [&a,b]()mutable->int {a = 100; b = 200; return a + b; };//外部a改b不改pfun();或cout<<pfun()<<endl;//对于returnreturn 0;
}
#include<iostream>
#include<list>
#include<algorithm>//算法头文件
using namespace std;int main()
{list<int>lst;lst.push_back(1);lst.push_back(2);lst.push_back(3);for_each(lst.begin(), lst.end(), [](int a) {cout << a << endl; });return 0;
}