首页 > 编程语言 >[C/C++] C++之Lambda表达式

[C/C++] C++之Lambda表达式

时间:2023-01-01 22:57:59浏览次数:64  
标签:变量 int 捕获 C++ 传递 include 表达式 Lambda

Lambda表达式也叫匿名函数,有时候也叫闭包(Closure)

参考视频注意视频中捕获变量部分有错误,按本博客为准

1. 定义

[OuterVar](int x, int y) -> int {
  return OuterVar + x + y;
};
  • [OuterVar]:捕获变量;
  • (int x, int y):参数列表;
  • -> int:返回类型为int,实际上返回值类型可以忽略的,因为编译器可以自行推断它的类型,所以 -> int 可以省略;

1.1 捕获变量(Capture Clause)

这个部分的功能是让匿名函数可以访问外部变量

  • 如果为空,表示不捕获任何变量。
  • 如果在某个Class中使用匿名函数,还可以用this捕获当前实例的指针,例如如果下面示例的匿名函数是在类中,可以使用[N, &M, this],在C++17标准之后,还可以使用 *this 按值捕获该实例;
  • C++14标准之后,还可以引入新的变量,例如下面示例中使用[N, &M, K = 5],引入新的变量K,并赋值5;
#include <iostream>
using namespace std;
int main(){
  int N = 100, M = 10;
  // 其中N是值传递,&M是引用传递
  auto lambda = [N, &M](int val) -> int{
    M = 20;
    return N * val;
  };
  cout << lambda(10) << endl;
  cout << M << endl;
  return 0;
}
/**
 * 1000
 * 20
 */

/*-----(附)使用this-----*/
#include <iostream>
using namespace std;
class A{
  int a = 10;
public:
  void demo(){
    auto lambda = [this](int val) -> int{
      this->a = 2333;
      return a * val;
    };
    cout << lambda(10) << endl;
  }
};
int main()
{
  A a;
  a.demo();
  return 0;
}
/**
 * 23330
 */

其他情况

  • 隐式捕获
    • [&]:按照引用传递捕获封闭范围中的所有变量
    • [=]:按照值传递捕获封闭范围中的所有变量
  • 隐式捕获+显式捕获(隐式捕获必须放在显示捕获前面):
    • [=, &M]:指定外部变量M使用引用传递捕获,其他变量用值传递捕获。上面的例子中,其等价的表达还有[&, N]
    • [&, M]:指定外部变量M使用值传递捕获(M前面不能加=),其他变量用引用传递捕获。上面的例子中,其等价的表达还有:

【注】:值传递的变量不能修改!!!

1.2 参数列表

就普通函数那样使用,C++14标准之后可以使用auto类型;

2.应用场景

  • 排序:排序算法sort,自定义排序规则的时候需要传入排序函数:

    #include <algorithm>
    #include <iostream>
    #include <vector>
    using namespace std;
    int main(){
      vector<int> vec{0, 11, 3, 19, 22, 7, 1, 5};
      auto rule = [](int a, int b){
        return a < b;
      };
      sort(vec.begin(), vec.end(), rule);
    }
    
  • (还有啥?)

标签:变量,int,捕获,C++,传递,include,表达式,Lambda
From: https://www.cnblogs.com/chasemeng/p/17019191.html

相关文章

  • C++实现向上取整
    1.使用库函数doubleceil(doublex)由于传入的参数和返回的参数都是double,所以需要手动转化代码:#include<bits/stdc++.h>usingnamespacestd;intmain(){......
  • C/C++按值传递和按地址传递
    C/C++的按值传递和按地址传递有明显不同,下面对他们作个区别:按值传递:在调用函数中将原函数的值拷贝一份过去被调用的函数,在被调用函数中对该值的修改不会影响原函数的值。按......
  • C++ Stack
    C++Stack基本操作头文件#include<stack>常用成员函数push(x)//x压入栈顶top()//返回栈顶元素的引用pop()//弹出栈顶元素empty()//栈为空返回true......
  • 《C++ —— 笔记》
      this指针在C++中成员变量和成员函数是分开存储的。每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码。那么问题是:这一块代码是......
  • C/C++备件管理系统
    C/C++备件管理系统综合项目(二)为某制造企业设计备件管理系统,主要包括如下功能:1)用户登录管理:管理员和普通用户权限及职能:管理员仅1名,为初始成员;普通用户可以是多名,普通用......
  • C/C++ 调用标准库函数实现 std::string to std::wstring 相互字符集变换(转)
    转自:https://blog.csdn.net/liulilittle/article/details/127697458#include<locale>#include<codecvt>#include<string>#include<vector>#if_MSC_VER>=1600......
  • C++ Primer第三章知识点(想起来啥记啥版)
    命名空间#include<iostream>//using声明,当我们使用名字cin时,从命名空间std中获取它usingstd::cin;intmain(){inti;cin>>i;//正确:cin和st......
  • 算法之Floyd-Warshall算法【c++】【图论】【最短路】
    我们作为刚学图论的小蒟蒻,先接触到的算法一定是图上最短路径算法。而最短路算法中最简单的当属Floyd-Warshall算法。下面是一些基本介绍:​该算法可以计算图上任意两点间......
  • C++ | 2-移动
    如何实现移动有分开的拷贝构造和移动构造函数。有swap成员函数,支持和另外一个对象快速交换成员。你的对象的名空间下,应当有一个全局的swap函数,调用成员函数swap来......
  • C++公司员工考勤管理系统[2023-01-01]
    C++公司员工考勤管理系统[2023-01-01]题目15“公司员工考勤管理系统设计”1、问题描述某公司需要存储雇员的编号、姓名、性别、所在部门,级别,并进行工资的计算。其中,雇......