首页 > 编程语言 >C++(lambda)

C++(lambda)

时间:2024-09-06 10:05:05浏览次数:7  
标签:变量 int 捕获 C++ result 表达式 lambda

目录



C++中的lambda表达式是一种匿名函数,通常用于简化代码,尤其是在处理临时或小型回调函数时。Lambda表达式引入于C++11,并在之后的C++标准中不断增强。它们可以捕获上下文中的变量,生成临时的函数对象,简化了编写内联函数的过程。



1. 语法

C++中的lambda表达式语法如下:

[capture](parameters) -> return_type {
    function_body
};

各部分的含义如下:

  • [capture]:捕获列表,用于指定 lambda 表达式可以使用的外部变量。
  • (parameters):参数列表,和普通函数类似,定义 lambda 表达式的参数。
  • -> return_type(可选):指定返回类型,如果可以自动推导则可以省略。
  • {}:函数体,定义 lambda 表达式的逻辑。


2. 示例

  1. 基本Lambda表达式

    auto add = [](int a, int b) {
        return a + b;
    };
    int result = add(2, 3);  // result = 5
    

    在这里,[] 是捕获列表,表示不捕获任何外部变量。(int a, int b) 是参数列表,表示接收两个整数参数。{ return a + b; } 是函数体,返回两个整数的和。

  2. 带捕获的Lambda表达式

    • 捕获外部变量:

      int x = 10;
      auto increment = [x](int a) {
          return a + x;
      };
      int result = increment(5);  // result = 15
      
    • 捕获外部变量的引用:

      int x = 10;
      auto increment = [&x](int a) {
          x += a;
          return x;
      };
      int result = increment(5);  // x = 15, result = 15
      
  3. 捕获所有外部变量

    • 捕获所有外部变量的副本(通过值捕获):

      int x = 10, y = 20;
      auto sum = [=]() {
          return x + y;
      };
      int result = sum();  // result = 30
      
    • 捕获所有外部变量的引用:

      int x = 10, y = 20;
      auto increment = [&]() {
          x += 5;
          y += 5;
      };
      increment();  // x = 15, y = 25
      
  4. 返回类型
    如果返回类型无法自动推导,可以显式指定:

    auto divide = [](int a, int b) -> double {
        return static_cast<double>(a) / b;
    };
    double result = divide(10, 3);  // result = 3.33333
    


3. 捕获方式

捕获列表中的变量可以通过以下几种方式捕获:

  • 按值捕获 ([x]):将外部变量x按值传递给lambda表达式,即生成lambda时会复制该变量的当前值。修改lambda中的变量不会影响外部变量。
  • 按引用捕获 ([&x]):将外部变量x的引用传递给lambda表达式,即lambda中对变量的修改会影响外部的变量。
  • 捕获所有变量的副本 ([=]):自动捕获所有在lambda体中使用的外部变量的副本。
  • 捕获所有变量的引用 ([&]):自动捕获所有在lambda体中使用的外部变量的引用。
  • 混合捕获 ([=, &x][&, x]):可以混合使用捕获方式,某些变量按值捕获,某些变量按引用捕获。


4. 可变性(mutable 关键字)

默认情况下,lambda表达式按值捕获的变量是不可修改的。如果需要修改捕获的变量,可以使用 mutable 关键字:

int x = 10;
auto modify = [x]() mutable {
    x += 5;
    return x;
};
int result = modify();  // result = 15, 但外部的x仍然是10


5. Lambda表达式的用途

  1. 用于STL算法
    Lambda表达式通常与STL算法结合使用,如 std::sortstd::for_each 等:

    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::for_each(vec.begin(), vec.end(), [](int &n) { n *= 2; });
    // vec 变为 {2, 4, 6, 8, 10}
    
  2. 回调函数
    Lambda表达式可以用于回调函数,简化了传递临时逻辑的过程。

  3. 并发编程
    在多线程或并发编程中,lambda表达式可以方便地传递临时任务到线程或任务队列中:

    std::thread t([]() {
        std::cout << "Hello from thread!" << std::endl;
    });
    t.join();
    


总结

C++中的lambda表达式使得编写简洁、灵活的代码更加容易,尤其在需要将临时的函数逻辑传递给其他函数或用于回调时。通过值捕获、引用捕获、自动推导返回类型等功能,lambda表达式为编写更具表现力和灵活性的代码提供了强大支持。



标签:变量,int,捕获,C++,result,表达式,lambda
From: https://www.cnblogs.com/keye/p/18399680

相关文章

  • 【C++】vector有关代码
     C++代码:#include<iostream>#include<vector>intmain(){//创建一个整数类型的vector并初始化std::vector<int>v={1,2,3};//使用迭代器遍历并打印vector中的每个元素for(autoi=v.begin();i!=v.end();++i){std::c......
  • C++ STL set/multiset容器
    set/multiset容器简介Set的特性是,所有元素都会根据元素的值自动被排序。Set不允许两个元素有相同的值。Set的迭代器iterator是一种const_iterator,不能通过迭代器改变任意set元素的值。multiset的特性和用法和set相同,唯一的差别在于它允许值重复。set和multiset的底层实现是红......
  • C++(#include <algorithm>)
    目录1.std::sort2.std::reverse3.std::find4.std::copy5.std::equal6.std::for_each7.std::unique8.std::transform总结#include<algorithm>是C++标准库中的一个头文件,包含了许多常用的算法函数,提供了操作容器、范围和数据的功能。这个库中的算法大多数是通用的,可......
  • 南沙信C++陈老师解一本通题: 2031:【例4.17】四位完全平方数
    ​ 题目描述】输出所有形如aabb的四位完全平方数(即前两位数字相等,后两位数字也相等)。【输入】无【输出】由小到大输出,每个数占一行。【输入样例】无【输出样例】无#include<bits/stdc++.h>usingnamespacestd;boolisSquare(intn){ inttmp=(int)sqrt(n......
  • 第十三届蓝桥杯大赛软件赛省赛C/C++ 大学 A 组
    之前没接触过oi赛制打了一下心态小崩。。以为会了五题写出来对了两题,我就是纯纯小丑哈哈。只打了两个小时也不能算正经vp把,就当是一个补题2.灭鼠先锋推必败必胜局面即可。具体的我就是乱推的,对于必胜的可能要稍微多想一会,对于必败的只要找出一种必败情况那显然就是必败了。但是......
  • C++ | 泛型编程:模板初阶与函数模板深度解析
    文章目录C++泛型编程:模板初阶与函数模板深度解析1.泛型编程:实现代码的通用性2.函数模板:代码的模具2.1什么是函数模板?2.2函数模板的格式2.3函数模板的原理2.4函数模板的实例化2.5模板参数的匹配原则3.类模板:更进一步的通用性3.1类模板的定义3.2类模板的实例化......
  • 【C++ 关键字】谈谈你对volatitle、extern 关键字的理解
    文章目录1.volatitle的概念2.volatitle的作用3.1.volatitle的概念......
  • 《C++中的面向对象编程三大特性:封装、继承与多态》
    在C++编程的广阔世界中,面向对象编程(Object-OrientedProgramming,OOP)的三大特性——封装、继承和多态,犹如三把强大的利器,帮助程序员构建出高效、可维护和可扩展的软件系统。本文将深入探讨如何在C++中实现这三大特性,并通过具体的代码示例展示它们的强大之处。一、封装(Enca......
  • 《深入理解 C++中的右值引用:开启高效编程新篇章》
    在C++的编程世界中,右值引用是一个强大而又富有特色的特性,它为程序员提供了更高效的资源管理方式和更灵活的编程手段。本文将带你深入探讨C++中的右值引用,揭示其独特的特点和强大的功能。一、标题背后的意义C++中的右值引用究竟有何特殊之处?为何它成为了C++编程中的热点......
  • 实现一个功能完备的 C++ String 类保姆指南
    本篇博客,我们将详细讲解如何从头实现一个功能齐全且强大的C++String类,并深入到各个细节。这篇博客将包括每一步的代码实现、解释以及扩展功能的探讨,目标是让初学者也能轻松理解。一、简介1.1、背景介绍在C++编程中,std::string类是最常用的字符串处理工具,它提供了丰......