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

Lambda表达式(附有案例)

Lambda表达式

Lambda表达式是C++11引入的一种函数对象(函数式编程)的语法扩展。它可以用于创建匿名的、临时的函数对象,并可以在需要函数对象的地方直接使用,而无需单独定义一个函数或函数对象类。

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

[capture list](parameters) -> return_type {
    // 函数体
}

其中,各部分的含义如下:

  • capture list:捕获列表,用于指定外部变量的访问方式。可以省略,表示不捕获任何外部变量;也可以采用值捕获、引用捕获或混合捕获的方式捕获外部变量。
  • parameters:参数列表,与普通函数的参数列表相似。可以省略,表示无参数。
  • -> return_type:返回类型,表示Lambda表达式的返回类型。可以省略,根据函数体中的返回语句自动推导返回类型。
  • {}:函数体,包含实际的执行逻辑。

Lambda表达式还有两种特殊形式:

  1. 表达式形式:当Lambda表达式只包含单个表达式时,可以省略{}和返回类型声明,直接通过表达式的结果进行返回。例如:[capture list](parameters) { return expression; }
  2. 语句形式:当Lambda表达式包含多个语句时,需要使用{}包围,并通过显式的return语句指定返回值。例如:[capture list](parameters) { statements; return expression; }

Lambda表达式主要用于以下几个方面:

  1. 作为函数对象(函数指针)的替代:可以将Lambda表达式作为参数传递给函数,用于回调或算法中。
  2. 简化代码:Lambda表达式可以直接在需要函数对象的地方定义和使用,避免了额外的函数定义和命名。
  3. 支持函数式编程:通过Lambda表达式,可以更方便地进行函数式编程的操作,如map、reduce、filter等。

在给定的代码示例中,Lambda表达式用于连接每个QClickLabelclicked信号与槽函数。它捕获了rowcolumncolorList这些外部变量,并在点击时通过调用NotifyManager::getInstance()->notifyOtherWindowChangeSkin()函数通知其他窗口改变皮肤颜色。Lambda表达式省略了返回类型声明,通过表达式的结果自动推导返回类型。

例子,演示了Lambda表达式的用法:

以下是一个简单的例子,演示了Lambda表达式的用法:

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

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

    // 使用Lambda表达式排序
    std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
        return a < b;
    });

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

    return 0;
}

在上述代码中,首先定义了一个整数向量numbers,其中包含一些整数。

然后,使用std::sort()算法对numbers进行排序。这里使用了一个Lambda表达式作为第三个参数,指定了排序的规则:如果a小于b,则返回true,否则返回false。Lambda表达式的参数列表为两个整数类型的参数ab,省略了返回类型声明,通过表达式的结果自动推导返回类型。

接下来,使用std::for_each()算法遍历numbers,并使用Lambda表达式打印每个元素。Lambda表达式的参数列表为一个整数类型的参数num,通过std::cout输出该参数的值。

运行以上代码,会将排序后的数字依次输出到控制台,结果为:1 2 3 5 8。

这个例子展示了Lambda表达式的两个常见应用场景:作为算法的参数传递,以及简化代码书写。通过Lambda表达式,可以在需要函数对象的地方直接定义和使用匿名的、临时的函数对象。


http://www.kler.cn/a/133376.html

相关文章:

  • core 文件
  • 创建型设计模式与面向接口编程
  • 高防服务器的费用受到哪些原因影响?
  • 项目风险管理的3大要素
  • C++STL容器——map和set
  • 速盾:高防 CDN 和 CDN 的缓存机制都一样吗?
  • 【无标题】乐观与悲观
  • Python基础入门例程61-NP61 牛牛的矩阵相加(循环语句)
  • 英语 有空就更新
  • 06.webpack性能优化--构建速度
  • UnitTest + Selenium 完成在线加法器自动化测试
  • C#创建AutoMapper的映射配置
  • debian10 开启rdp安装firefox,firefox 中文乱码
  • 设计模式(一)-简要概述(2)
  • 时序预测 | Python实现ConvLSTM卷积长短期记忆神经网络股票价格预测(Conv1D-LSTM)
  • 01Urllib
  • 【Java】ArrayList和LinkedList使用不当,性能差距会如此之大!
  • Web(5)Burpsuite之文件上传漏洞
  • VMware vSphere 中的 DRS(分布式资源调度)、HA(高可用性)和Fault Tolerance(FT,容错)区别
  • CI/CD - jenkins
  • python项目源码基于django的宿舍管理系统dormitory+mysql数据库文件
  • CF1514 C. Product 1 Modulo N [妙妙题]
  • 小程序游戏、App游戏与H5游戏:三种不同的游戏开发与体验方式
  • Axure基础详解二十二:随机点名效果
  • 【PG】PostgreSQL高可用之自动故障转移-repmgrd
  • Rocket如何实现顺序消费