当前位置:首页 > 科技  > 软件

C++使用Lambda表达式实例讲解

来源: 责编: 时间:2023-11-02 09:09:01 190观看
导读C++ 中的 Lambda 表达式是一种匿名函数,可以方便地创建并传递函数对象。这是 C++11 引入的一项重要功能,可以大大提高代码的可读性和简洁性。以下是一个深入讲解 C++ 使用 Lambda 表达式的例子,包括基本语法、捕获列表、

7cK28资讯网——每日最新资讯28at.com

C++ 中的 Lambda 表达式是一种匿名函数,可以方便地创建并传递函数对象。这是 C++11 引入的一项重要功能,可以大大提高代码的可读性和简洁性。7cK28资讯网——每日最新资讯28at.com

以下是一个深入讲解 C++ 使用 Lambda 表达式的例子,包括基本语法、捕获列表、函数调用、以及与 STL 的结合使用等。7cK28资讯网——每日最新资讯28at.com

Lambda基本语法

首先,我们来看一个最简单的 lambda 表达式:7cK28资讯网——每日最新资讯28at.com

[](){/* do nothing */};

这个 lambda 表达式定义了一个空函数,没有参数,也没有返回值。你可以将其看作是一个没有实体的具名函数。7cK28资讯网——每日最新资讯28at.com

你还可以定义带有参数的 lambda 表达式:7cK28资讯网——每日最新资讯28at.com

[](int a, float b){return a + b;};

这个函数接收两个参数,一个是 int 类型的 a,另一个是 float 类型的 b。它的返回值是 a  b 的和。7cK28资讯网——每日最新资讯28at.com

你也可以定义带有默认参数的 lambda 表达式:7cK28资讯网——每日最新资讯28at.com

[](int a, float b = 0.0f){return a + b;};

这个函数和上一个函数功能基本相同,只是 b 参数的默认值是 0.0f7cK28资讯网——每日最新资讯28at.com

Lambda的捕获列表

你还可以在 lambda 表达式中捕获外部变量的值:7cK28资讯网——每日最新资讯28at.com

int a = 10;float b = 20.0f;auto add = [&a, &b]() { return a + b; }; // 使用引用捕获外部变量std::cout << add() << std::endl; // 输出 30

在这个例子中,&a  &b 是通过引用来捕获 a  b 的值的。这意味着 lambda 表达式可以修改捕获的变量的值。如果你只想在 lambda 表达式中使用外部变量的值,而不修改它们的值,你应该使用值捕获而不是引用捕获。例如:7cK28资讯网——每日最新资讯28at.com

int a = 10;float b = 20.0f;auto add = [a, b]() { return a + b; }; // 使用值捕获外部变量std::cout << add() << std::endl; // 输出 30

在这个例子中,虽然 a  b 的值被传递给了 lambda 表达式,但是 lambda 表达式并不能修改它们的值。7cK28资讯网——每日最新资讯28at.com

Lambda与函数调用

你可以将 lambda 表达式作为一个函数参数传递给其他函数。例如,你可以使用一个 lambda 表达式来作为 std::sort 函数的比较函数:7cK28资讯网——每日最新资讯28at.com

std::vector<int> v = {5, 3, 1, 4, 2};std::sort(v.begin(), v.end(), [](int a, int b) {return a < b;}); // 使用 lambda 表达式作为比较函数std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " ")); std::cout << std::endl; // 输出 1 2 3 4 5

在这个例子中,lambda 表达式 [](int a, int b) {return a < b;} 被传递给了 std::sort 函数,用于比较 v 中的元素。这意味着你可以用 lambda 表达式来实现自定义的算法和数据结构。7cK28资讯网——每日最新资讯28at.com

Lambda与 STL 的结合使用

下面我们再来看一个比较复杂但很有用的例子:使用 lambda 表达式和 STL 来查找一个 vector 中第一个出现的不重复的元素:7cK28资讯网——每日最新资讯28at.com

#include <iostream>#include <vector>#include <algorithm>#include <unordered_set>int main() {    std::vector<int> v = {1, 2, 3, 2, 4, 3, 5, 6, 4};    auto it = std::find_if(v.begin(), v.end(), [&](int a) {    	return std::find(std::begin(un), std::end(un), a) == std::end(un);    });    }

在这个例子中,我们使用了一个较为复杂的 lambda 表达式来作为 std::find_if 函数的比较函数。这个 lambda 表达式接收一个参数 a,然后使用一个名为 un  std::unordered_set 来查找 a 是否第一次出现。这个例子展示了如何使用 lambda 表达式和 STL 来解决一个复杂的问题。7cK28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-16511-0.htmlC++使用Lambda表达式实例讲解

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 聊一聊 Python 的换行以及转义

下一篇: 不是吧?这 十个 React UI 组件库你不会还不知道吧?

标签:
  • 热门焦点
  • 6月iOS设备好评榜:第一蝉联榜首近一年

    6月iOS设备好评榜:第一蝉联榜首近一年

    作为安兔兔各种榜单里变化最小的那个,2023年6月的iOS好评榜和上个月相比没有任何排名上的变化,仅仅是部分设备好评率的下降,长年累月的用户评价和逐渐退出市场的老款机器让这
  • 容量越大越不坏?24万块硬盘故障率报告公布 这些产品零故障

    容量越大越不坏?24万块硬盘故障率报告公布 这些产品零故障

    8月5日消息,云存储服务商Backblaze发布了最新的硬盘故障率报告,年故障率有所上升。Backblaze发布的硬盘季度统计数据,其中包括故障率等重要方面。这些结
  • 太卷!Redmi MAX 100英寸电视便宜了:12999元买Redmi史上最大屏

    太卷!Redmi MAX 100英寸电视便宜了:12999元买Redmi史上最大屏

    8月5日消息,从小米商城了解到,Redmi MAX 100英寸巨屏电视日前迎来官方优惠,到手价12999元,比发布价便宜了7000元,在大屏电视市场开卷。据了解,Redmi MAX 100
  • 掘力计划第 20 期:Flutter 混合开发的混乱之治

    掘力计划第 20 期:Flutter 混合开发的混乱之治

    在掘力计划系列活动第20场,《Flutter 开发实战详解》作者,掘金优秀作者,Github GSY 系列目负责人恋猫的小郭分享了Flutter 混合开发的混乱之治。Flutter 基于自研的 Skia 引擎
  • 把LangChain跑起来的三个方法

    把LangChain跑起来的三个方法

    使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain跑起来
  • 之家push系统迭代之路

    之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • 一文搞定Java NIO,以及各种奇葩流

    一文搞定Java NIO,以及各种奇葩流

    大家好,我是哪吒。很多朋友问我,如何才能学好IO流,对各种流的概念,云里雾里的,不求甚解。用到的时候,现百度,功能虽然实现了,但是为什么用这个?不知道。更别说效率问题了~下次再遇到,
  • 三星Galaxy Z Fold5今日亮相:厚度缩减但仍略显厚重

    三星Galaxy Z Fold5今日亮相:厚度缩减但仍略显厚重

    据官方此前宣布,三星将于7月26日也就是今天在韩国首尔举办Unpacked活动,届时将带来带来包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
  • 北京:科技教育体验基地开始登记

    北京:科技教育体验基地开始登记

      北京“科技馆之城”科技教育体验基地登记和认证工作日前启动。首批北京科技教育体验基地拟于2023年全国科普日期间挂牌,后续还将开展常态化登记。  北京科技教育体验基
Top