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

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

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

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

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

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

Lambda基本语法

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

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

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

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

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

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

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

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

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

Lambda的捕获列表

你还可以在 lambda 表达式中捕获外部变量的值:Mdc28资讯网——每日最新资讯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 表达式中使用外部变量的值,而不修改它们的值,你应该使用值捕获而不是引用捕获。例如:Mdc28资讯网——每日最新资讯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 表达式并不能修改它们的值。Mdc28资讯网——每日最新资讯28at.com

Lambda与函数调用

你可以将 lambda 表达式作为一个函数参数传递给其他函数。例如,你可以使用一个 lambda 表达式来作为 std::sort 函数的比较函数:Mdc28资讯网——每日最新资讯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 表达式来实现自定义的算法和数据结构。Mdc28资讯网——每日最新资讯28at.com

Lambda与 STL 的结合使用

下面我们再来看一个比较复杂但很有用的例子:使用 lambda 表达式和 STL 来查找一个 vector 中第一个出现的不重复的元素:Mdc28资讯网——每日最新资讯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 来解决一个复杂的问题。Mdc28资讯网——每日最新资讯28at.com

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

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

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

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

标签:
  • 热门焦点
  • MIX Fold3包装盒泄露 新机本月登场

    小米的全新折叠屏旗舰MIX Fold3将于本月发布,近日该机的真机包装盒在网上泄露。从图上来看,新的MIX Fold3包装盒在外观设计方面延续了之前的方案,变化不大,这也是目前小米旗舰
  • 6月安卓手机性价比榜:Note 12 Turbo断层式碾压

    6月份有一个618,虽然这是京东周年庆的日子,但别的电商也都不约而同的跟进了,反正促销没坏处,厂商和用户都能满意。618期间一些产品也出现了历史低价,那么各个价位段的产品性价比
  • 三言两语说透设计模式的艺术-简单工厂模式

    一、写在前面工厂模式是最常见的一种创建型设计模式,通常说的工厂模式指的是工厂方法模式,是使用频率最高的工厂模式。简单工厂模式又称为静态工厂方法模式,不属于GoF 23种设计
  • Automa-通过连接块来自动化你的浏览器

    1、前言通过浏览器插件可实现自动化脚本的录制与编写,具有代表性的工具就是:Selenium IDE、Katalon Recorder,对于简单的业务来说可快速实现自动化的上手工作。Selenium IDEKat
  • 企业采用CRM系统的11个好处

    客户关系管理(CRM)软件可以为企业提供很多的好处,从客户保留到提高生产力。  CRM软件用于企业收集客户互动,以改善客户体验和满意度。  CRM软件市场规模如今超过580
  • 如何使用JavaScript创建一只图像放大镜?

    译者 | 布加迪审校 | 重楼如果您曾经浏览过购物网站,可能遇到过图像放大功能。它可以让您放大图像的特定区域,以便浏览。结合这个小小的重要功能可以大大改善您网站的用户体验
  • “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • 华为HarmonyOS 4.0将于8月4日发布 或搭载AI大模型技术

    华为宣布HarmonyOS4.0将于8月4日正式发布。此前,华为已经针对开发者公布了HarmonyOS4.0,以便于开发者提前进行适配,也因此被曝光出了一些新系统的特性
  • 自研Exynos回归!三星Galaxy S24系列将提供Exynos和骁龙双版本

    年初,全新的三星Galaxy S23系列发布,包含Galaxy S23、Galaxy S23+和Galaxy S23 Ultra三个版本,全系搭载超频版骁龙8 Gen 2,虽同样采用台积电4nm工艺制
Top