c++11标准中的lambda

来源:互联网 发布:税友软件好用吗 编辑:程序博客网 时间:2024/05/29 11:56

在c++11标准中定义了一种新的可调用对象 lambda

lambda类似与匿名函数 , 只不过可以通过一种机制(不是参数)来调用一些局部变量 , 这样就能使自身的参数变少,也就能达到STL中某些算法对谓词的要求。

lambda的形式:


  1. lambda表达式的引入标志,在‘[]’里面可以填入变量,表示lambda要捕获的变量 , 这就是lambda的关键处 。  可以为空
  2. lambda表达式的参数列表 , 可以没有参数
  3. Mutable 标识 , 在某种情况下才需要
  4. 异常标识
  5. 返回类型
  6. “函数”体,也就是lambda表达式需要进行的实际操作

简单的lambda例子:

<span style="font-size:14px;">int a = 2 , b = 3;    auto c = [](int x , int y)->int { return x+y;};  //传递了两个整形的形参    cout<<c(a,b)<<endl;</span>

<span style="font-size:14px;">    int a = 2 , b = 3;    auto c = [a,b]()->int { return a+b;};//捕获了两个局部变量 a 和 b</span>

这两个例子是形参和lambda捕获。


1、在lambda中的捕获可以分为值捕获和地址捕获 , 和在函数中的传值、传地址是一样的。

在变量前面加上& , 就表示传地址 , +就表示传值(默认就是传值)

<span style="font-size:14px;">    int a = 2 , b = 3;    auto c = [&a,&]()->int { return a+b;};</span>

捕获还分了隐式和显示捕获

我们前面的捕获都是显示捕获 , 隐式捕获就是指:把所有的局部变量,都以一种方式进行捕获。

全部以引用(地址捕获)的方式进行捕获:

<span style="font-size:14px;">    int a = 2 , b = 3;    auto c = [&]()->int { return a+b;};</span>

如果当中有某个变量不能用引用的方式捕获 , 可以这样
<span style="font-size:14px;">    int a = 2 , b = 3;    auto c = [&,+a]()->int { return a+b;};</span>

2、值传递时的可变lambda

      当我们需要改变把传入到lambda中值时 , 我们就需要加入mutable , 表示这是一个可变的lambda

<span style="font-size:14px;">    int a = 2 ;    auto c = [a]()mutable->int { return a++;};    cout<<c()<<endl;</span>

如果是引用传递 , lambda能不能改变 , 取决于 , 引用的变量是不是const。


3、lambda在STL算法中的运用 , 在sort中的运用
<span style="font-size:14px;">#include <iostream>#include <algorithm>#include <vector>using namespace std;struct node{    int value;}b[10];int main(){    int i ;    for(i = 5; i >= 1; i--)    {        b[5-i].value = i;    }    sort(b , b+5 , [](struct node x , struct node y)->bool {return x.value < y.value;});    for(i = 0; i < 5; i++)        cout<<b[i].value<<endl;    return 0;}</span>


0 0