泛型lambda表达式和普通lambda表达式的区别

C++14学习笔记(1)——泛型Lambda 泛型Lambda C++11中引入了Lambda表达式,但是必须将形式参数声明为具体的类型。而在C++14中,我们可以使用auto作为形式参数的类型说明 阅读详情

语法差异

  • 普通 lambda 表达式:在定义时需要明确指定参数的具体类型。其基本语法为 [捕获列表](参数列表) -> 返回类型 { 函数体 },其中参数列表中的每个参数都要有明确的类型声明。
#include <iostream>

int main() {
    auto add = [](int a, int b) {
        return a + b;
    };
    std::cout << add(3, 5) << std::endl;
    return 0;
}

在上述代码中,add 是一个普通 lambda 表达式,它明确指定了两个参数 a 和 b 的类型为 int。

  • 泛型 lambda 表达式:从 C++14 开始支持,使用 auto 关键字来声明参数类型,从而实现参数类型的泛化。其语法与普通 lambda 类似,但参数列表中使用 auto 替代具体类型。
#include <iostream>

int main() {
    auto genericAdd = [](auto a, auto b) {
        return a + b;
    };
    std::cout << genericAdd(3, 5) << std::endl;
    std::cout << genericAdd(3.5, 2.5) << std::endl;
    return 0;
}

这里的 genericAdd 是一个泛型 lambda 表达式,auto 关键字让它可以接受不同类型的参数,既可以是整数,也可以是浮点数。

参数类型灵活性

  • 普通 lambda 表达式:参数类型是固定的,在编译时就已经确定。这意味着它只能处理特定类型的参数,如果传入的参数类型与定义的类型不匹配,会导致编译错误。
#include <iostream>

int main() {
    auto multiply = [](int a, int b) {
        return a * b;
    };
    // 下面这行代码会编译错误,因为参数类型不匹配
    // std::cout << multiply(3.5, 2.5) << std::endl; 
    return 0;
}
  • 泛型 lambda 表达式:参数类型在调用时根据传入的实参自动推导,具有更高的灵活性。同一个泛型 lambda 可以处理多种不同类型的参数,只要这些参数支持 lambda 函数体中的操作。
#include <iostream>
#include <string>

int main() {
    auto concatenate = [](auto a, auto b) {
        return a + b;
    };
    std::cout << concatenate(3, 5) << std::endl;
    std::cout << concatenate(std::string("Hello, "), std::string("World!")) << std::endl;
    return 0;
}

在这个例子中,concatenate 泛型 lambda 既可以用于整数相加,也可以用于字符串拼接。

使用场景差异

  • 普通 lambda 表达式:适用于处理特定类型数据的场景,当你明确知道函数需要处理的数据类型时,使用普通 lambda 可以提高代码的可读性和性能,因为编译器可以在编译时进行更精确的优化。例如,在对整数向量进行排序时,可以使用普通 lambda 来定义比较规则。
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> numbers = {5, 3, 8, 1, 2};
    std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
        return a < b;
    });
    for (int num : numbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    return 0;
}
  • 泛型 lambda 表达式:更适合于需要处理多种类型数据的通用算法或函数,能够提高代码的复用性。例如,在实现一个通用的打印函数时,使用泛型 lambda 可以打印不同类型的容器元素。
#include <iostream>
#include <vector>
#include <list>

template<typename Container>
void printContainer(const Container& container) {
    auto printElement = [](const auto& element) {
        std::cout << element << " ";
    };
    for (const auto& element : container) {
        printElement(element);
    }
    std::cout << std::endl;
}

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::list<std::string> lst = {"apple", "banana", "cherry"};
    printContainer(vec);
    printContainer(lst);
    return 0;
}

在上述代码中,printElement 泛型 lambda 可以用于打印不同类型容器中的元素,增强了代码的通用性。

实现原理差异

  • 普通 lambda 表达式:编译器会为其生成一个具体的类类型,该类重载了函数调用运算符 operator(),并且参数类型和返回类型都是明确的。
  • 泛型 lambda 表达式:编译器同样会生成一个类类型,但该类的 operator() 是一个模板函数,参数类型由模板参数决定,在调用时根据实参进行模板实例化。

综上所述,泛型 lambda 表达式和普通 lambda 表达式各有优缺点,应根据具体的使用场景选择合适的 lambda 表达式类型。

Action<T>和Func<T>泛型委托,委托,泛型,匿名函数,Lambda表达式的综合使用 前言 在上篇文章C#中委托(delegate)和多播委托的理解中已经基本了解了委托的用法。 由于委托封装的方法我们不一定知道其传入的参数和返回值,例如之前说的的排序方法—————在对象的排序算法中,需要对对象进行比较,而不同对象比较的方法不同,所以比较两个对象的方法的引用可以作为参数传递到排序算法中,这个时候就需要传递方法。 当我们要生成一个封装比较对象的方法的委托时,我们并不知道该方法传入对象是... 阅读详情

相关推荐

泛型Lambda,如此强大!

最近发现泛型编程有了另一利器——泛型Lambda,比想象当中要强大许多,威力不小,和大家分享一下。本篇内容需要对泛型编程有所了解,若是读过之前更新的相关文章,食用更佳。1泛型编程开始之前,...

编程与实战的博客 1331

泛型lambda表达式

对泛型lambda表达式及应用进行分析说明

fpcc的专栏 1002

Java8中lambda表达式的应用及一些泛型相关知识

主要介绍了Java8中lambda表达式的应用及一些泛型相关知识的相关资料

突破编程_C++_C++14新特性(泛型 Lambda 表达式)

C++14 新特性:泛型 Lambda 表达式

突破编程 1521

Simulink机电仿真避坑指南:如何用MATLAB解决液压系统建模的3大典型问题

本文针对液压系统建模在Simulink动态仿真中常见的三大难题——参数物理意义缺失、模型收敛性差及性能优化瓶颈,提供了专业的MATLAB解决方案。文章详细阐述了如何从物理参数推导仿真模型、破解代数环与刚性系统问题,并分享了模型降阶与加速技巧,旨在帮助工程师构建精确高效的机电系统仿真模型。

o9p0q1的博客 295

利用HipSTR从二代测序数据中精准解析短串联重复序列(STR)的遗传多态性

本文详细介绍了如何利用HipSTR工具从二代测序(NGS)数据中精准解析短串联重复序列(STR)的遗传多态性。通过三步走策略,HipSTR能够高效识别STR区域、估算重复次数并判定基因型,适用于法医鉴定、疾病研究和细胞系鉴定等多个领域。文章还提供了实战操作指南和常见问题解决方案,帮助研究者充分利用NGS数据开展STR分析。

weixin_28702105的博客 483

3.7泛型和Lambda表达式

泛型接口的定义和普通接口类似,只是在接口名后面添加了类型参数。类型参数可以有一个或多个,用逗号分隔。// 定义一个泛型接口 Generator,T 是类型参数T next();在上述代码中,Generator是一个泛型接口,它定义了一个方法next(),该方法返回类型为TT是一个类型参数,代表一种未知的类型。

chxii的专栏 785

第五节 Amesim《直动型溢流阀HCD建模》HCD5 学习资料

利用HCD原则创建直动型溢流阀的界面。这可能包括图形化表示直动型溢流阀的工作原理、操作方式和调节方法。这样的界面应当直观且易于理解,使用户能够轻松了解阀门的功能和使用方法。

m0_58052642的博客 1330

Java_4_Lambda_泛型_集合

Java_4_Lambda_泛型_集合

LXL2790的博客 903

从零开始解析N-CMAPSS数据集:航空发动机健康管理的入门指南

本文详细解析了N-CMAPSS数据集在航空发动机健康管理中的应用,从数据集的构成、关键变量到实际数据分析方法,为初学者提供了全面的入门指南。通过Python代码示例,展示了如何加载、探索和建模这一复杂数据集,帮助读者掌握航空发动机性能预测的核心技术。

weixin_29063979的博客 320

Jetson AGX Orin平台Jetpack5升级Jetpack6,自研载板USB不工作问题调试

1. 问题描述将AGX Orin工业的新板放到定制的载板上当在ubuntu 22和Jetpack 6.1上使用SDKManager刷机时,lsusb为空,并且在引导时没有发现/注册xusb设备。USB C端口正常打开并供电,但似乎没有数据传输。在Ubuntu 18 Jetpack 5.1.4 SDKManager上同样刷机之后,usb C集线器在引导时被正确地发现,显示在lsusb中,并识别/挂载外部驱动器。

jzwjzw19900922的博客 1510

(C++11/C++14新特性)C++中的Lambda表达式——捕获方式和参数?值捕获和引用捕获?泛型Lambda和普通Lambda?

普通Lambda和泛型Lambda区别?Lambda无捕获变量可转换为函数指针?类成员函数如何使用Lambda?......

qq_60018273的博客 1491

【图像拼接(Image Stitching)】关于【图像拼接论文精读】专栏的相关说明,包含专栏使用方法、阅读顺序、创新思路、文章汇总、源码汇总、数据集汇总等。总之,【图像拼接论文相关】看这一篇就够了

为什么会有这篇文章?因为专栏简介里写不下太多东西,只能通过这篇文章和大家交流,算是一个专栏阅读指南吧。说点心里话本来吧,我只想用优快云来记录自己学习【图像拼接】领域论文的过程,对每篇文章有个细致的理解,方便自己反复查阅。设置为付费也是因为涉及论文和本人其他项目需要,防止查重和其他问题,所以价格最开始设置的是专栏付费价格里最高的。起初,确实没有人看,一切也都平淡地度过着。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 4万+

158. Java Lambda 表达式 - 构造函数方法引用的使用与实践

Java Lambda表达式中的构造函数方法引用(ClassName::new)提供了一种简洁的方式来引用类的构造函数。它能替代传统lambda表达式创建对象,支持空构造和带参数构造两种形式。语法上,空构造函数常用于Supplier接口,带参构造函数则配合Function等接口使用。使用时需注意区分不同重载构造方法,并确保类型匹配。典型应用场景包括创建集合对象(如ArrayList::new)等。通过方法引用可以提升代码可读性,减少冗余代码。

yaoxin521123的博客 1122

BlockUI专栏目录

BlockUI是一个设计NX对话框的工具,是官方推荐使用的对话框制作方法,能够与NX自身风格相统一,并且在实际开发中经常被使用。BlockUI可以帮助用户快速创建NX对话框,支持多种控件类型,如按钮、文本框、标签等。通过使用BlockUI,用户可以轻松地自定义对话框的布局、样式和交互行为。此外,BlockUI还提供了一些高级功能,如动态更新、条件显示和事件处理等,以帮助用户创建更加复杂和灵活的对话框。本专栏讲述了使用BlockUI制作NX对话框的方法,介绍了每个控件的功能,并且分享一些常用操作的源码。

王牌飞行员_里海的博客 1633

【用unity实现100个游戏之18】从零开始制作一个类CSGO/CS2、CF第一人称FPS射击游戏——基础篇1(附项目源码)

生存和射击游戏一直是我的最爱,说起3D最普遍的应该就是射击系统了,你可以在任何情况下加入射击功能,所以我写下了这篇FPS开发记录。希望对你有帮助。在这个项目中,你将学习如何设计和实现射击系统、武器系统、玩家控制、场景设计等方面的内容。通过这个项目,你将深入了解游戏开发中的许多核心概念和技术,并且在实践中不断提升自己。本项目将带你从零开始逐步实现一个完整的第一人称射击游戏,并且会逐步引入一些高级功能,如特效、声音等。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 5500

java基础知识 泛型,set,map和collcetions的笔记

6.n不是泛型方法,该方法不能使用static关键字修饰,因为该方法中的T需要在new对象时才能明确类型。1.泛型接口和普通接口的区别就是后面添加了类型参数列表,可以有多个类型参数,如:等。comparate to 一个负整数,零或正整数,因为此对象小于,等于或者大于指定的对象。(2)自然排序的规则比较单一,而比较器的规则比较多元化,而且比较器优先于自然排序。extends E>表示类型的上界是E,只能是E或者是E的子类。super E>表示类型的下界是E,只能是E或者是E的父类。

weixin_54913430的博客 237

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

委托的学习

委托的使用主要是为了解决不知道什么时候可能触发的这种事件而用的。 我们举个例子,假如你开了一家餐厅,除了日常的餐饮业务之外,还会有电话订餐等业务。电话订餐的业务就可以委托给儿子,这个过程就叫做委托。 儿子接完电话可以告诉你,也可以不告诉你,这就看这个委托的类型。 一、普通委托(比如我们要执行一两个数的加法运算) //第一步,定义委托 (接电话这个事件) publi...

U3D开发 191

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Java之Collection单列集合接口中的常用方法

这里我们通过多态来学习Collection接口常用方法 记得为Collection指定一个泛型是很好的习惯 Collection<Integer> collection=new ArrayList<>(); 01添加方法 collection.add(1); 可以多添加几个 collection.add(1); collection.add(1); collection.add(2); collection.add(3); 02集合清空方法 collection.clear(

qq_40850266的博客 183

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

set、list集合的遍历、list集合的常用方法

String[] arr=new String[2]; arr[0]=“aa”; arr[1]=“bb”; arr[3]=“cc”; for(int i=0;i<arr.length;i++){ System.out.println(arr[i]); } 上面一段代码会出现数组下标越界的异常,更何况我们大部分情况下都是从前端接收数据,对于数据量更不可控 集合解决了Java中数组不能动态扩充的...

qq_41767337的博客 880

C++仿函数和Lambda表达式

C++仿函数和Lambda表达式一,普通函数二,仿函数三,Lambda表达式四,Lambda外部变量捕获 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;在使用algorithm算法库中的很多函数时,最后一个参数都是需要传入一个函数指针,当对数组或者容器数据遍历时,通过函数指针指向的函数内部的逻辑处理进行过滤,筛选出符合条件的值并进行结果统计或返回。第三个参数的实现形式,从最开始的普通...

bajianxiaofendui的博客 1万+

C#中静态方法与普通方法的区别、Lambda表达式

C#中静态方法与普通方法的区别、Lambda表达式

wanganqiqi的博客 3143

lambda 表达式——匿名函数 auto i= [ ] () { };

leetcode 的 submission 是收到 IO 速度的影响的…… 尽管和其他 OJ 网站不同, leetcode 给你提供了完备的代码级的接口,它的测试例仍旧是通过 IO 来读取的,真是让人桑心。 明白这一点是因为,我在查看某道题目的最快解时,发现了这么一段代码。平心而论,他的代码并不比我的复杂度要简化多少,然而却比我快10倍以上,我本来百思不得其解,直到我发现了这么一段代码: s...

Jeff_的博客 1万+

从 C++11 到 C++14:深入对比普通 Lambda 与泛型 Lambda

在 C++ 中,Lambda 表达式和泛型 Lambda 的核心区别在于和 适用场景。,类似于普通函数。:处理已知具体类型的参数。参数类型固定(如int和double只能处理类型严格匹配的输入。无法直接处理未知类型或模板化参数。auto,支持类型推导,类似于函数模板。:处理未知类型或需要通用代码的场合。参数类型由编译器推导(相当于模板参数)。可以处理任意类型(只要操作合法,如支持a + b本质上会生成一个 函数对象模板。

CppPlayer 515

C++中,Lambda表达式和std::function的作用及区别

std::function的作用是提供一个通用的函数对象包装器,可以用于存储和调用任何可调用对象,包括函数指针、函数对象和Lambda表达式。std::function提供了一种统一的接口来处理不同类型的函数对象,使得它们可以像普通函数一样进行调用。综上所述,Lambda表达式和std::function在功能和使用上有所差异,根据具体的需求可以选择合适的方式来处理函数对象。Lambda表达式适用于临时定义的简短函数逻辑,而std::function适用于需要存储和传递不同类型函数对象的场景。

weixin_49146002的博客 1762

C++ Lambda表达式学习

Lambda是对象,不是函数:理解这一点有助于理解其行为和限制捕获决定成员:捕获列表定义了Lambda对象的数据成员时机很重要:值捕获在创建时发生,引用捕获在调用时解析生命周期管理:这是使用Lambda时最容易出错的地方。

muke668的博客 1160
上一篇: USB通信协议C++demo
下一篇: TCP粘包问题原因及如何解决
越甲八千
博客等级 码龄11年 2959粉丝 553原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值