首页 > 编程语言 >C++ lambda表达式

C++ lambda表达式

时间:2024-02-20 12:11:08浏览次数:22  
标签:std 变量 int auto 捕获 C++ 表达式 lambda

C++ lambda表达式,又称为闭包,匿名函数

入门语法

举个例子

 auto f = [](int a,int b){
        return a <b;
    };
    std::vector<int> vec = {0,11,2,23,4};
    std::sort(vec.begin(),vec.end(),f);

上面的就是通过一个简单的匿名函数来简化了排序,lambda表达式具体语法如下:

[OuterVar](int x,int y)->int {
  return OuterVar + x+y;
}

其中[]中OuterVar被称为捕获变量,可以有值或者为空,然后括号中包起来的是参数列表,箭头跟着返回类型,最后是函数体。其他lambda表达式的返回类型,编译器会自行推导,所以上面的代码中的->可以省略。下面和上面是等价的。

[OuterVar](int x,int y){
  return OuterVar + x+y;
}

变量的捕获(capture clause)

介绍捕获

让我们的匿名函数可以访问外部变量,甚至修改外部变量
举例

int N=100,M=10;
    auto g = [N,&M](int i)
    {
        M=20;
        return N*i;
    };
    std::cout<<g(10) <<"  "<<M<<std::endl;
//输出 1000  20

这里的N和M都被匿名函数访问了,M前有引用符号,表示按照引用来捕获。

[&]和[=] 捕获

[&]和[=]是两种常见的捕获模式,它们分别代表按引用捕获和按值捕获。

[&]:按引用捕获

使用&符号表示lambda表达式应该按引用捕获其封闭作用域中的所有变量。这意味着在lambda函数体内对捕获的变量的任何修改都会影响到原始变量。

#include <iostream>  
#include <vector>  
#include <algorithm>  

int main() {  
    std::vector<int> numbers = {1, 2, 3, 4, 5};  

    // 使用lambda表达式按引用捕获变量sum,并在lambda中修改它  
    int sum = 0;  
    std::for_each(numbers.begin(), numbers.end(), [&sum](int n) {  
        sum += n;  
    });  

    std::cout << "Sum: " << sum << std::endl;  // 输出:Sum: 15  
    return 0;  
}
//输出 Sum: 15

[=]:按值捕获

使用=符号表示lambda表达式应该按值捕获其封闭作用域中的所有变量。这意味着在lambda函数体内捕获的变量是原始变量的副本,对副本的任何修改都不会影响到原始变量。

注意不能对其中变量进行修改。

#include <iostream>  
  
int main() {  
    int x = 10;  
    int y = 20;  
  
    // 使用[=]按值捕获x和y  
    auto lambda = [=]() {  
        std::cout << "x = " << x << ", y = " << y << std::endl;  
        // 注意:不能修改x和y,因为它们是按值捕获的副本  
        // x=20; 这个代码编译器会报错
    };  
  
    // 调用lambda表达式  
    lambda();  
  
    return 0;  
}

其他捕获的知识

[this]  表示捕获当前实例的指针
[*this] 表示按值捕获该实例

在C++14后,你还可以在捕获语句中定义新变量

#include <iostream>  
int main() {  
    int x = 10;  
    int y = 20;  
    // 增加新变量k
    auto lambda = [x,y,k=5]() {  
        std::cout << "x = " << x << ", y = " << y <<   ", k = " << k << std::endl;  
        //  x = 10, y = 20, k = 5
    };  
    lambda();  
    return 0;  
}

在C++14后,lambda的参数列表支持auto类型,更加通用和泛化


    int x = 10;  
    int y = 20;  
  
    // 参数列表修改成auto类型
    auto lambda = [](auto x,auto y) {  
        std::cout << "x = " << x << ", y = " << y   << std::endl;  
        //  x = 10, y = 20, k = 5
    };  
  
    lambda(x,y);  
//输出 x = 10, y = 20

标签:std,变量,int,auto,捕获,C++,表达式,lambda
From: https://www.cnblogs.com/AndreaDO/p/18022779

相关文章

  • [975] Creating a POSTMAN Api | AWS API Gateway Passing Data to AWS Lambda
    ref:AWSLambdaFunctionURLsref:GuidetoAWSLambdaFunctionURLs1.CreateaLambdaFunctionaws->Services->Lambda2.CreateaFunctionURLConfiguration->FunctionURLThen,theFunctionURLisgeneratedandcanbeseenfromtheup......
  • C++ 函数指针,指针函数,左值右值
    C++函数指针,指针函数,左值右值1.函数指针是一个指针类型的变量,存放的内容都是函数的指针,用来间接调用函数,格式如下:intadd(inta,intb){ returna+b;}int(*fadd)(inta,intb);//函数的指针,变量名需要被括号括起来,并且前面+*注意:函数指针的变量名要在前面+*号,同时......
  • c++vector
    下面是我在学习过程中对vector的理解,希望能够帮助到大家;vector(容器)(本质和数组一致)不过其对象长度不定.与数组不一样的是在使用vector是需要写头文件#include下面举出几个例子来说明:vectorv;  建立了一个名为v的int类型的容器,在这里并没有初始话值为多少,所以此时为......
  • 一文总结 C++ 常量表达式、constexpr 和 const
    TLDR修饰变量的时候,可以把constexpr对象当作加强版的const对象:const对象表明值不会改变,但不一定能够在编译期取得结果;constexpr对象不仅值不会改变,而且保证能够在编译期取得结果。如果一个const变量能够在编译期求值,将其改为constexpr能够让代码更清晰易读。constexp......
  • C++ 深拷贝浅拷贝
    C++深拷贝浅拷贝C++默认生成的拷贝构造函数,他的行为就是浅拷贝,他只会复制一个一模一样的的指针,并不会操作指针指向的东西。要想实现我们的逻辑需求,就要自定义拷贝构造函数,实现深拷贝。我们来具体说明一下上面的话首先我们创建一个简单的类#include<iostream>usingnamespa......
  • 线性插值计算百分位数的C++示例
    代码如下#include<iostream>#include<vector>#include<algorithm>doublepercentile_linear_interpolation(conststd::vector<double>&data,doublepercentile){//确保百分位数在合理范围内if(percentile<0.0||percentile>1......
  • C/C++ 宏区分不同系统、编译器、语言版本
    目录区分不同系统区分不同编译器及其版本区分不同语言及其版本参考区分不同系统1)_WIN32,Windows系统_WIN64:32bitand64bit系统M_WIN64:仅64bitWindows系统M_WIN32:仅32bitWindows系统_WINDOWS:GUIApplication_CONSOLE:consoleApplication2)__APPLE__,苹果系统,包括MAC、IOST......
  • VC++ 中 CT2A CA2T 两个宏进行字符串转换简单测试
    #include"afxwin.h"#include<iostream>usingnamespacestd;intmain(){CStringcs=_T("西游记");AfxMessageBox(_T("CString:")+cs);//CString转ACSIICT2Aa_str(cs);stringstd_str(a_str);......
  • KY78 最大上升子序列和C++
    这个解决问题的思路使用动态规划,即用已知状态去得到未知状态。思路逻辑是这样sum[i]记录以A[i]为末上升子序列的和的最大值然后从j从0-i-1遍历如果A[j]<A[i]那么sum[i]=sum[j]+A[i];然后找出sum[i]中的的最大值,就是以A[i]为末上升子序列的和的最大值。这样就实现了从前......
  • FUN GAME 一款普通的C++游戏
    凑合看吧,不是完整版。#include<bits/stdc++.h>#include<windows.h>#include<conio.h>usingnamespacestd;#defineptputs#definepfprintf#definepcputchar#definesfscanf#definegtgets#defineslSleepcharname[101];stack<int>gun;bo......