0

0

C++Lambda表达式 匿名函数编写方法

P粉602998670

P粉602998670

发布时间:2025-08-28 08:57:01

|

1007人浏览过

|

来源于php中文网

原创

Lambda表达式是C++中的匿名函数,可捕获外部变量并作为函数参数使用,适用于一次性简单逻辑处理。

c++lambda表达式 匿名函数编写方法

C++ Lambda表达式,本质上就是匿名函数,它允许你在代码中定义一个函数,而不需要给它一个名字。你可以把它理解成一个“一次性”的函数,用完就丢,非常适合用在那些只需要简单逻辑,而且只会被调用一次的地方。

Lambda表达式的基本语法是:

[capture list](parameter list) -> return type { function body }
。 记住这个结构,你就能写出简单的Lambda表达式了。

Lambda表达式在C++中提供了一种便捷的方式来定义和使用匿名函数,尤其是在需要函数对象作为参数的场合,例如算法、事件处理等。

什么是捕获列表,它有什么用?

捕获列表(

[capture list]
)是Lambda表达式中非常关键的部分。它决定了Lambda表达式如何访问其所在作用域的变量。简单来说,就是Lambda表达式能不能用它外部的变量,用哪一些,怎么用。

立即学习C++免费学习笔记(深入)”;

捕获方式有几种:

  • []
    :空捕获列表
    。Lambda表达式不能访问任何外部变量。它就像一个完全封闭的函数,只能使用自己的参数和内部定义的变量。
  • [x, &y]
    :显式捕获
    x
    以值传递的方式捕获,
    y
    以引用传递的方式捕获。这意味着Lambda表达式内部会复制一份
    x
    的值,对
    x
    的修改不会影响外部的
    x
    ,而对
    y
    的修改会直接影响外部的
    y
  • [&]
    :隐式引用捕获
    。Lambda表达式可以访问其所在作用域的所有变量,并且都是以引用传递的方式。要小心使用,因为Lambda表达式的生命周期可能超过外部变量的生命周期,导致悬挂引用。
  • [=]
    :隐式值捕获
    。Lambda表达式可以访问其所在作用域的所有变量,并且都是以值传递的方式。相对安全,但如果捕获的变量很大,可能会有性能问题。
  • [=, &z]
    :混合使用
    。大部分变量以值传递的方式捕获,但
    z
    以引用传递的方式捕获。
  • [this]
    :捕获
    this
    指针
    。Lambda表达式可以访问当前对象的成员变量和成员函数。只有在类的成员函数中才能使用。

举个例子:

#include 
#include 
#include 

int main() {
    int value = 10;
    std::vector numbers = {1, 2, 3, 4, 5};

    // 使用Lambda表达式,捕获 value,并对 numbers 中的每个元素加上 value
    std::for_each(numbers.begin(), numbers.end(), [&value](int &n) {
        n += value;
    });

    // 打印结果
    for (int number : numbers) {
        std::cout << number << " "; // 输出:11 12 13 14 15
    }
    std::cout << std::endl;

    return 0;
}

在这个例子中,

[&value]
表示以引用方式捕获
value
,Lambda表达式内部修改了
value
,会影响到外部的
value

选择哪种捕获方式取决于你的需求。如果Lambda表达式只需要读取外部变量的值,那么值传递是更安全的选择。如果Lambda表达式需要修改外部变量的值,那么引用传递是必要的。但一定要注意引用传递可能带来的风险。

如何指定Lambda表达式的返回类型?

Lambda表达式的返回类型通常可以由编译器自动推导出来。大多数情况下,你不需要显式指定返回类型。但是,在某些情况下,编译器无法正确推导返回类型,或者为了代码的可读性,你需要显式指定返回类型。

指定返回类型的语法是使用

-> return_type

auto add = [](int a, int b) -> int {
    return a + b;
};

在这个例子中,

-> int
明确指定了Lambda表达式的返回类型是
int

什么时候需要显式指定返回类型呢?

Yourware
Yourware

专注于AI编程作品部署与分享的云托管平台

下载
  • 复杂表达式: 当Lambda表达式包含多个
    return
    语句,或者包含复杂的条件分支时,编译器可能无法正确推导返回类型。
  • 类型转换: 当你希望Lambda表达式返回的类型与实际计算结果的类型不同时,你需要显式指定返回类型进行类型转换。
  • 通用代码: 为了提高代码的可读性和可维护性,即使编译器可以推导返回类型,也可以显式指定返回类型。

一个需要显式指定返回类型的例子:

auto func = [](int x) -> double {
    if (x > 0) {
        return 3.14;
    } else {
        return 0; // 即使这里返回的是整数,整个Lambda表达式的返回类型仍然是 double
    }
};

如果省略了

-> double
,编译器会尝试推导返回类型,可能会导致类型不匹配的错误。

Lambda表达式可以作为函数参数传递吗?怎么做?

当然可以!Lambda表达式最常见的用途之一就是作为函数参数传递,尤其是那些需要函数对象(Function Object)作为参数的函数,比如标准库中的算法函数(

std::sort
std::for_each
std::transform
等)。

直接把Lambda表达式写在函数调用的参数位置就行了。

#include 
#include 
#include 

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

    // 使用 Lambda 表达式作为 std::sort 的比较函数
    std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
        return a < b; // 升序排序
    });

    // 打印排序后的结果
    for (int number : numbers) {
        std::cout << number << " "; // 输出:1 2 5 8 9
    }
    std::cout << std::endl;

    return 0;
}

在这个例子中,Lambda表达式

[](int a, int b) { return a < b; }
被直接传递给了
std::sort
函数,用于指定排序的规则。

如果你觉得Lambda表达式太长,影响代码可读性,也可以先把它赋值给一个变量,然后再传递给函数:

auto compare = [](int a, int b) {
    return a > b; // 降序排序
};

std::sort(numbers.begin(), numbers.end(), compare);

这种方式更清晰,也方便Lambda表达式的复用。

使用Lambda表达式作为函数参数,可以使代码更简洁、更灵活。你可以在调用函数的地方直接定义函数对象的行为,而不需要单独定义一个函数或类。

Lambda表达式和普通函数有什么区别

Lambda表达式和普通函数都是用来封装一段代码逻辑的,但它们之间有一些关键的区别:

  1. 匿名性: Lambda表达式是匿名的,没有名字。普通函数必须有名字。
  2. 定义位置: Lambda表达式通常在需要使用函数对象的地方直接定义,例如作为函数参数传递。普通函数需要在单独的地方定义。
  3. 捕获外部变量: Lambda表达式可以捕获其所在作用域的变量。普通函数不能直接访问局部变量,只能通过参数传递。
  4. 简洁性: Lambda表达式通常比普通函数更简洁,尤其是在处理简单逻辑时。
  5. 灵活性: Lambda表达式更灵活,可以根据需要动态地定义函数对象的行为。

总结一下:

特性 Lambda表达式 普通函数
名字 匿名 必须有
定义位置 灵活 单独定义
捕获变量 可以 不可以
简洁性 更简洁 较冗长
灵活性 更灵活 较固定

选择使用Lambda表达式还是普通函数,取决于你的具体需求。如果只需要一个简单的、一次性的函数对象,并且需要访问外部变量,那么Lambda表达式是更好的选择。如果需要一个可以被多次调用的、复杂的函数,并且不需要访问外部变量,那么普通函数是更好的选择。

相关专题

更多
sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

389

2023.09.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

401

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

543

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

53

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

53

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

101

2025.10.23

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

206

2023.09.15

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

70

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.6万人学习

C 教程
C 教程

共75课时 | 4.2万人学习

C++教程
C++教程

共115课时 | 13.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号