当前位置: 首页 > article >正文

通过示例来展示C++中Lumda函数的原理是什么及如何来使用它?

在C++中,Lambda表达式(也称为Lambda函数或匿名函数)是一种简洁的定义匿名函数对象的方式。Lambda表达式通常用于定义那些只会在局部使用的函数对象。它们非常强大,可以用来编写简洁且易于理解的代码,特别是在使用标准库算法时。

Lambda表达式的基本结构

Lambda表达式的基本语法如下:

[capture](parameters) mutable -> return_type {
    // 函数体
}
  • [capture]:捕获列表,用于指定Lambda表达式外部的哪些变量可以被Lambda内部访问。
  • (parameters):参数列表,和普通函数参数列表类似。
  • mutable(可选):允许在Lambda表达式内部修改捕获的变量(默认情况下,捕获的变量是只读的)。
  • -> return_type(可选):指定Lambda表达式的返回类型。如果Lambda体只有一个返回语句,且该语句的类型可以推断出来,则可以省略该部分。
  • { function_body }:Lambda表达式的函数体。

示例

下面是一个简单的示例,展示了如何使用Lambda表达式来打印一个整数列表中的每个数。

#include <iostream>
#include <vector>
#include <algorithm> // 用于std::for_each

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

    // 使用Lambda表达式遍历vector并打印每个元素
    std::for_each(numbers.begin(), numbers.end(), [](int num) {
        std::cout << num << std::endl;
    });

    return 0;
}

在这个例子中,std::for_each算法被用来遍历numbers容器中的每个元素。Lambda表达式[](int num) { std::cout << num << std::endl; }作为第三个参数传递给std::for_each。这个Lambda表达式没有捕获任何外部变量(捕获列表为空),接受一个int类型的参数num,并且没有返回类型(因为std::cout语句没有返回值,且没有指定返回类型,编译器会推断出返回类型为void)。

捕获列表示例

捕获列表允许Lambda表达式访问并操作外部作用域中的变量。

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

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

    // 使用Lambda表达式和捕获列表来计算总和
    std::for_each(numbers.begin(), numbers.end(), [&sum](int num) {
        sum += num; // 捕获sum变量并通过引用修改它
    });

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

    return 0;
}

在这个例子中,捕获列表[&sum]指定了Lambda表达式将通过引用捕获外部变量sum,这样Lambda表达式内部就可以修改sum的值了。

Lambda表达式是C++11及以后版本中引入的一个非常有用的特性,它们提供了一种灵活的方式来编写简洁的函数式风格的代码。


http://www.kler.cn/news/315272.html

相关文章:

  • SOI 刻蚀气体
  • DHCP协议原理(网络协议)
  • 用apache httpd来实现反向代理
  • openFrameworks_如何使用ofxXmlSettings和ofxGui来创建识别界面
  • 机器人的动力学——牛顿欧拉,拉格朗日,凯恩
  • C++ —— vector 的模拟实现
  • 【计算机网络】运输层协议解析
  • Flutter - Win32程序是如何执行main函数
  • jmeter得到的文档数据处理
  • 后端接收数组,集合类数据
  • 数据结构之算法复杂度
  • 基于BiGRU+Attention实现风力涡轮机发电量多变量时序预测(PyTorch版)
  • 软考中级软件设计师——数据结构与算法基础学习笔记
  • 【图灵完备 Turing Complete】游戏经验攻略分享 Part.5 编程
  • 【若依RuoYi-Vue | 项目实战】帝可得后台管理系统(二)
  • Linux自主学习篇
  • oracle中NUMBER(1,0)的字段如何映射到c#中
  • 【设计模式-适配】
  • SSC377/D, 5M30 64/128MB, 1Tops1. 支持双摄,甚至三摄;2. 夜视全彩;3. 省内存、省带宽;4. 算力较大,适合新的算法模型;
  • 图像处理与分析
  • Spring的任务调度
  • 怎么在路由器上使用tcpdump抓包
  • Redisson 分布式锁的使用详解
  • Vue3中shallowRef和ref区别
  • 确保在AWS上的资源安全:构建坚不可摧的云安全防线
  • C++ prime plus-2-编程练习
  • 解决 Torch not compiled with CUDA enabled 问题 | MiniCPM3-4B 【应用开发笔记】
  • Android 短信验证码自动填充
  • Unity 设计模式 之 创建型模式 -【单例模式】【原型模式】 【建造者模式】
  • 【力扣】2376. 统计特殊整数