「C/C++」C/C++ Lamada表达式

news/2024/11/23 20:52:40/

在这里插入图片描述

✨博客主页:何曾参静谧的博客
📌文章专栏:「C/C++」C/C++程序设计


相关术语

Lambda表达式:C++11引入的一种函数对象,可以方便地创建匿名函数。与传统的函数不同,Lambda表达式可以在定义时直接嵌入代码,无需单独定义函数名称、参数和返回类型等信息。Lambda表达式通常用于需要定义一些简单的回调函数或者函数对象。优点:简洁效率高更加灵活

一、语法格式

//Lambda表达式的语法如下:
[capture-list] (parameter-list) opt -> return-type { function-body }
[捕获列表](参数列表) 函数选项 -> 返回值类型{函数体};//示例代码:
auto ret = [](int a,int b) -> int {return a + b;
};

1.1、捕获列表[capture-list]

  • [] - 不捕捉任何变量
  • [&] - 捕获外部作用域中所有变量,并作为引用在函数体内使用 (按引用捕获)
  • [=] - 捕获外部作用域中所有变量,并作为副本在函数体内使用 (按值捕获)
    – 拷贝的副本在匿名函数体内部是只读的
  • [=, &foo] - 按值捕获外部作用域中所有变量,并按照引用捕获外部变量 foo
  • [bar] - 按值捕获 bar 变量,同时不捕获其他变量
  • [&bar] - 按引用捕获 bar 变量,同时不捕获其他变量
  • [this] - 捕获当前类中的 this 指针
    – 让 lambda 表达式拥有和当前类成员函数同样的访问权限
    – 如果已经使用了 & 或者 =, 默认添加此选项

1.2、参数列表(parameter-list)

其中,parameter-list可以包含以下内容:

  • 空参数列表:(),表示没有任何参数。
  • 普通参数列表:(int a, double b)。
  • 可变参数列表:(int a, double b, …),表示可以接受任意数量的参数。
//例如,以下Lambda表达式将接受两个整数作为参数,并返回它们的和:
auto lambda = [](int a, int b) -> int { return a + b; };

1.3、 函数选项(opt)可省略

mutable: 可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)一般和[=]一起
exception: 指定函数抛出的异常,如抛出整数类型的异常,可以使用 throw ();

1.4、返回类型 -> return-type

标识函数返回值的类型,当返回值为 void,或者函数体中只有一处 return 的地方(此时编译器可以自动推断出返回值类型)时,这部分可以省略

//例如,以下Lambda表达式将接受两个整数作为参数,并返回它们的和:
auto lambda = [](int a, int b) { return a + b; };

1.5、函数体 { function-body }

函数的实现,这部分不能省略,但函数体可以为空,可以包含任意数量的语句

//例如,以下Lambda表达式将按值捕获变量x和y,并返回它们的和:
int x = 1, y = 2;
auto lambda = [=]() -> int {int sum = x + y;return sum;
};

二、使用Lambda表达式

Lambda表达式可以像普通函数一样使用,可以赋值给函数对象、作为函数参数或返回值等。下面是一些使用Lambda表达式的示例:

2.1、赋值给函数对象

可以将Lambda表达式赋值给函数对象,以便在其他地方使用。

#include <iostream>
#include <functional>int main()
{std::function<int(int, int)> add = [](int a, int b) -> int {return a + b;};std::cout << add(1, 2) << std::endl; // 输出3return 0;
}

2.2、作为函数参数

可以将Lambda表达式作为函数参数传递,用于定义回调函数等。

#include <iostream>
#include <vector>
#include <algorithm>int main()
{std::vector<int> vec = {1, 2, 3, 4, 5};// 使用Lambda表达式定义判断是否为偶数的函数对象auto is_even = [](int n) -> bool {return n % 2 == 0;}; // 注意这里要添加分号// 使用std::count_if算法统计偶数个数int count = std::count_if(vec.begin(), vec.end(), is_even);std::cout << count << std::endl; // 输出2return 0;
}

2.3、作为返回值

可以将Lambda表达式作为函数的返回值,用于动态生成函数对象。

#include <iostream>
#include <functional>std::function<int(int, int)> create_adder(int n){// 使用Lambda表达式动态生成函数对象return [n](int x, int y) -> int {return n + x + y;};
}int main(){auto adder = create_adder(10);std::cout << adder(1, 2) << std::endl; // 输出13return 0;
}

2.4、匿名函数

//这个匿名函数只是被定义,不会被调用。
[](){cout << "这是一个Lamada匿名函数"};
//匿名函数定义+调用。
[](){cout << "这是一个Lamada匿名函数"}();
// 匿名函数的定义+调用:
int ret = [](int a) -> int
{return a+1;
}(100);  // 100是传递给匿名函数的参数
// 在匿名函数外部定义变量
int a=1, b=2, c=3;
// 调用匿名函数
[](){// 打印外部变量的值cout << "a:" << a << ", b: " << b << ", c:" << c;  // error, 不能使用任何外部变量
};[&](){cout  << "使用引用的方式传递数据: ";cout  << "a+1:" << a++ << ", b+c= " << b+c;
}();// 值拷贝的方式使用外部数据
[=](int m, int n)mutable{cout  << "使用拷贝的方式传递数据: ";// 拷贝的外部数据在函数体内部是只读的, 如果不添加 mutable 关键字是不能修改这些只读数据的值的// 添加 mutable 允许修改的数据是拷贝到函数内部的副本, 对外部数据没有影响cout  << "a+1:" << a++ << ", b+c= " << b+c;cout  << "m+1: " << ++m << ", n: " << n;
}(1, 2);

在这里插入图片描述


http://www.ppmy.cn/news/235625.html

相关文章

高品质蓝牙耳机排行榜,值得入手的四款蓝牙耳机分享

2023年即将到来&#xff0c;还有哪些蓝牙耳机值得大家购买呢&#xff1f;蓝牙耳机在我们日常生活中发挥着很大作用。无论是听歌还是通话&#xff0c;又或者是运动健身、玩游戏等&#xff0c;都常见大家使用。同样也伴随着蓝牙耳机市场的壮大&#xff0c;五花八门的耳机层出不穷…

高质量蓝牙耳机推荐,2023年热销火爆的蓝牙耳机推荐

目前市面上的无线蓝牙耳机品类众多&#xff0c;面对琳琅满目的无线蓝牙耳机&#xff0c;很多人一时之间无从下手&#xff0c;不知道质量好又耐用的蓝牙耳机有哪些&#xff0c;就怕选购到不好的蓝牙耳机&#xff0c;因此小编根据2023年热销火爆的蓝牙耳机热卖榜&#xff0c;给大…

防水运动蓝牙耳机,分体式蓝牙耳机品牌推荐

蓝牙耳机的出现让我们避免了有线耳机线材缠绕的烦恼&#xff0c;凭借超高的便携性成为当下最热门的数码单品。因工作关系&#xff0c;我每天都会接触到各类数码产品&#xff0c;其中就包含蓝牙耳机&#xff0c;看很多网友发帖表示不知道蓝牙耳机哪个品牌好&#xff0c;这里我打…

哪款蓝牙耳机音质好又耐用?2023年最值得推荐的四款蓝牙耳机分享

在这个科技发展迅速的时代里&#xff0c;大小街上都能看到很多人佩戴着耳机听音乐刷视频&#xff0c;但是蓝牙耳机实在是太卷了&#xff0c;越来越多人想入手一款好的蓝牙耳机&#xff0c;但不知道该怎么选择&#xff0c;下面我给大家推荐几款我使用下来最好的蓝牙耳机&#xf…

i12蓝牙耳机使用说明书图片_蓝牙耳机使用常见问题

小派根据用户的咨询与疑惑,整理了蓝牙耳机的常见使用问题。如果仍无法解决你的问题,可以直连联系小派(wx:pamu00)! 那些关于蓝牙耳机的Q&A Q1:耳机无法开机、开机没有反应不亮灯? 原因: 1、电量问题:先检查耳机的电量,可能是耳机没电,需要先充满电。 2、电池问题…

LG HBS730蓝牙耳机使用总结

http://www.lg.com/us/cell-phone-accessories/lg-HBS730/technical-specifications 上面是官方链接&#xff0c;可以看到具体参数。不过能搜到这个博客的人应该都知道这耳机长什么样。 优点&#xff1a; 1. 佩戴方便&#xff0c;挂在脖子上&#xff0c;不使用的时候可以把耳塞…

蓝牙资讯|Q2全球TWS耳机出货量排行出炉,蓝牙音频新技术将推出市场

Canalys 最新统计数据显示&#xff0c;2022 年第二季度全球个人智能音频设备出货量达 9810 万部&#xff0c;同比下降 1.7%。 报告指出&#xff0c;作为全球第三大个人智能音频设备市场&#xff0c;印度在本季度实现了逆势而上&#xff0c;出货量大幅增长 55.0%。但印度的增幅…

南卡蓝牙耳机和JBL蓝牙耳机哪个更值得买?音质最好的蓝牙耳机测评

有没有人和我一样选蓝牙耳机时除了音质方面之外还很注重外观的&#xff1f;本人非常喜欢搜罗各种拥有独特的佩戴方式、且外观奇特时尚的无线蓝牙耳机。这两款耳机出现在我面前的时候我就完完全全被吸引了&#xff0c;不仅音质好&#xff0c;而且耳机的外观造型非常美观时尚。一…