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

【C++】C++ 中 的 lambda 表达式(匿名函数)

C++11 引入的匿名函数,通常被称为 Lambda 函数,是语言的一个重要增强,它允许程序员在运行时创建简洁的、一次性使用的函数对象。Lambda 函数的主要特点是它们没有名称,但可以捕获周围作用域中的变量,这使得它们非常适合在函数式编程风格中使用,特别是在处理标准模板库(STL)的算法时。

1. 基本语法

Lambda 函数的如下:

[capture](parameters) -> return_type {body
}
  • capture(捕获列表):定义哪些外部变量可以被lambda函数访问。可以是按值捕获(=, 默认方式)、按引用捕获(&)或者是混合捕获([=, &var])。
  • parameters(参数列表):像普通函数一样,定义函数接收的参数。
  • return_type(返回类型):可选,如果能从函数体推断出来,可以省略。
  • body(函数体):包含要执行的代码。

2. 示例

#include <iostream>int main() {int a = 1, b = 2;auto add = [](int x, int y) -> int { return x + y; }; // 定义一个lambda函数std::cout << "Sum: " << add(a, b) << std::endl; // 使用lambda函数return 0;
}

3. 特性与限制

  • 编译器隐式转换:lambda表达式可以隐式转换为函数指针、函数对象或者符合特定要求的函数对象类型。
  • 可调用性:lambda表达式实例化后,可以像普通函数那样被调用。
  • 闭包:lambda表达式加上其捕获的外部变量形成一个闭包,可以在定义它的范围之外使用。
  • 类型:lambda表达式自身具有一个未命名的编译器生成的类类型,可以通过auto关键字来自动推导类型。

4. STL算法应用

作为函数对象传递给 STL 算法,如 std::sort 或 std::transform。
在异步编程中,作为回调函数。
实现函数式编程风格,如过滤、映射和折叠操作。

5. 演进

从C++11到C++20,lambda表达式的能力得到了不断的扩展,包括但不限于:

C++14开始支持初始化捕获(如x = someValue {})。
C++17引入了通用捕获([=, &x]),允许混合使用默认捕获模式。
C++20进一步增强了lambda的功能,例如可以为lambda表达式指定模板参数列表。

http://www.lryc.cn/news/341736.html

相关文章:

  • OpenSSL实现AES-CBC加解密,可一次性加解密任意长度的明文字符串或字节流(QT C++环境)
  • cURL:命令行下的网络工具
  • Baumer工业相机堡盟工业相机如何通过NEOAPISDK查询和轮询相机设备事件函数(C#)
  • Day45代码随想录动态规划part07:70. 爬楼梯(进阶版)、322. 零钱兑换、279.完全平方数、139.单词拆分
  • 土壤重金属含量分布、Cd镉含量、Cr、Pb、Cu、Zn、As和Hg、土壤采样点、土壤类型分布
  • 力扣:100284. 有效单词(Java)
  • 如何快速掌握DDT数据驱动测试?
  • OpenCV如何实现背投(58)
  • 5-在Linux上部署各类软件
  • 【Jenkins】持续集成与交付 (八):Jenkins凭证管理(实现使用 SSH 、HTTP克隆Gitlab代码)
  • 开源模型应用落地-CodeQwen模型小试-SQL专家测试(二)
  • Arch Linux安装macOS
  • 接口自动化框架篇:Pytest + Allure报告企业定制化实现!
  • 保持 Hiti 证卡打印机清洁的重要性和推荐的清洁用品
  • Unity C#的底层原理概述
  • 国产数据库的发展势不可挡
  • 权益商城系统源码 现支持多种支付方式
  • python安装问题及解决办法(pip不是内部或外部命令也不是可运行)
  • Json高效处理方法
  • 若依分离版-前端使用echarts组件
  • android native开发
  • Partisia Blockchain 生态zk跨链DEX上线,加密资产将无缝转移
  • Vue3组合式API + TS项目中手写国际化插件
  • 深入解析Jackson的ObjectMapper:核心功能与方法指南
  • 计算机是如何执行指令的
  • Jetson Orin NX L4T35.5.0平台相机stop导致系统死机问题调试
  • 【个人博客搭建】(18)使用Quartz.NET 定时备份数据库
  • 【python】MVC架构
  • SVM单类异常值检测
  • 前端动画总结