C++ 中的匿名函数(lambda表达式)
问题引入
使用std::sort函数对自定义类型排序时,我们需要传入一个比较函数作为参数。该比较函数只需要使用一次,但占有一个全局命名域中的名字,而且非常短,短到不需要名字就知道它的作用。这很浪费命名资源。
解决问题
使用匿名函数(又名lambda表达式)可以解决这个问题,它允许我们在另一个函数中定义一个匿名的函数。这不仅节约了名字,还让一个函数的定义尽可能靠近它的使用处。
c++中匿名函数的形式如下:
[ captureClause ] ( parameters ) -> returnType
{
statements;
}
captureClause不在本博客范围内,若有兴趣自行搜索。
parameters表示该函数的参数。
returnType表示该函数的返回值类型。(若省略"->returnType",则返回值默认为auto)
statements为函数体语句。
例子
将数组中数字按绝对值升序排列。
#include <bits/stdc++.h>
using namespace std;
int n;
vector<int> b;
static auto _ = []() {
std::ios::sync_with_stdio(false);
cin.tie(nullptr);
return nullptr;
}(); //Here () means we call this lambda expression
int main() {
cin >> n;
b.clear();
b.resize(n);
for (int i = 0; i < n; ++i) {
cin >> b[i];
}
sort(b.begin(), b.end(),
[](const int a, const int b) { return abs(a) < abs(b); }); //Here is our lambda, no capture clause
for (int i = 0; i < n; ++i) {
cout << b[i] << " ";
}
}
输入:
9
-3 -5 9 1 2 -7 -8 4 -6
输出:
1 2 -3 4 -5 -6 -7 -8 9
备注
注意到上述代码定义了一个名字是_(下划线)的函数的静态lambda表达式。最后的括号表示调用这个表达式。一般在OJ中经常使用这个表达式来加速输入输出。
更深刻的理解——lambda表达式的类型
事实证明,lambda表达式不存在显式的类型。编译器会为它生成一个不暴露给我们的特定类型。其实lambda表达式不是函数,是重载了()操作符的对象,只是表现和函数相似。
C++ 中的匿名函数(lambda表达式)的更多相关文章
- Qt中使用匿名函数lambda表达式
一.为什么要使用匿名函数lamdba 首先,lambda表达式可以使代码变得简单,C++中,一个lambda表达式表示一个可调用的代码单元.如代码: #include <QCoreApplica ...
- 【Unity|C#】基础篇(9)——匿名函数 / Lambda表达式
[学习资料] <C#图解教程>(第13章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.baidu. ...
- Python中的匿名函数lambda的用法
一.lambda函数的简介 对lambda函数,它其实是一个类似于def的函数,只不过lambda是一个不需要定义函数名的匿名函数.当我们在有些时候,需要做一些简单的数学计算时,如果定义一个def函 ...
- 匿名函数 lambda表达式(lambda expression)
阅读g2log时,发现有两行代码居然看不懂. 1. auto bg_call = [this, log_directory]() {return pimpl_->backgroundChang ...
- (28)C#委托,匿名函数,lambda表达式,事件
一.委托 委托是一种用于封装命名和匿名方法的引用类型. 把方法当参数,传给另一个方法(这么说好理解,但实际上方法不能当参数,传入的是委托类型),委托是一种引用类型,委托里包含很多方法的引用 创建的方法 ...
- Python匿名函数——lambda表达式
如果要定义的函数很简单,一个return语句就能搞定,可以使用lambda表达式来定义, lambda表达式的语法如下: lambda parameters: expression lambda表达式 ...
- 【C#】委托中的匿名函数与lambda
将方法作为方法的参数 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使 ...
- python做中学(八)匿名函数lambda的用法
匿名函数,顾名思义即没有名称的函数,和def定义的函数的最大区别在于匿名函数创建后返回函数本身(即匿名函数不需要return来返回值),表达式本身结果就是返回值,而def创建后则赋值给一个变量名,在P ...
- 匿名函数(lambda)在列表生成式和生成器中的应用示例
匿名函数(lambda)在列表生成式和生成器中的应用示例 列表生成式中实例 先看题: 以下代码的输出是什么?请给出答案并解释: def func(): return [lambda x: x * i ...
- 匿名函数 =匿名方法+ lambda 表达式
匿名函数的定义和用途 匿名函数是一个"内联"语句或表达式,可在需要委托类型的任何地方使用. 可以使用匿名函数来初始化命名委托[无需取名字的委托],或传递命名委托(而不是命名委托类型 ...
随机推荐
- [Leetcode]扁平化多级双向链表
题目 https://leetcode-cn.com/explore/learn/card/linked-list/197/conclusion/764/ 代码 /* // Definition ...
- 【深入浅出Spring原理及实战】「源码调试分析」结合DataSourceRegister深入分析ImportBeanDefinitionRegistrar的源码运作流程
每日一句 人的一生中不可能会一帆风顺,总会遇到一些挫折,当你对生活失去了信心的时候,仔细的看一看.好好回想一下你所遇到的最美好的事情吧,那会让你感觉到生活的美好. 注入案例代码 如何通过实现Sprin ...
- 目标检测+双目测距——基于yolov5
效果 测试例子1 输入: 左图 右图 输出: 测试例子2 输入: 左图 右图 输出: 测试例子3 输入: 左图 右图 输出: 核心代码 基于yolov5-6.1版本和双目测距+点云--使用Middle ...
- MornHus--一个野生蒟蒻的生成
野生蒟蒻一个. 蒟蒻的洛谷首页:MornHus 蒟蒻已经遗弃的CSDN首页:MornHus 写博的内容: 主要就是平时写写算法的笔记,有的时候写点数学题,有的时候还会搞一些奇怪的东西[doge] 大蒟 ...
- 克拉玛依初赛-wp
MISC 签到 16进制转字符串 base64 再来一次base64 flag 论禅论道 7z解压得到jar 使用decom打开 解密 得到flag WEB pingme 抓包,修改POST提交的参数 ...
- 在Typescript项目中,使用ESLint和Prettier,以及解决保存代码后ESLint配置冲突问题
首先,检查项目中根目录.eslintrc.js文件,该文件中定义了ESLint的基础配置,找到其中的rules 例如: const prettierConfig = require('./.prett ...
- 【随笔记】XR872 Codec 驱动移植和应用程序实例(附芯片调试方法)
XR872 的 SDK 是我目前接触过那么多款 MCU 的 SDK 中,唯一一个将框架和 RTOS 结合的非常完美的 SDK .无论是代码风格还是框架的设计,看起来都很赏心悦目,而且是源码开源.希望能 ...
- STL关联式容器使用注意、概念总结
引入 继上文 STL序列式容器使用注意.概念总结 继续总结关联式容器的概念以及一些使用事项. 关联式容器与容器适配器 基础容器 STL 中的关联式底层容器:RB tree, hash table,可以 ...
- 9月22日内容总结——计算机五大组成部分详解、编程语言及发展史、python解释器安装与环境变量设置
内容总结 目录 内容总结 一.计算机五大组成部分详细介绍 1.控制器 2.运算器 3.存储设备 4.输入设备 5.输出设备 二.计算机三大核心硬件 1. cpu 2.内存 举例:写文档时,突然关机了. ...
- FAQ selenium无法click的一个案例分享(1)
案例描述 http://sahitest.com/demo/php/fileUpload.htm 来自助教咨询 点击网页的第一个选择文件,如图 示例代码 from selenium import w ...