问题引入

使用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表达式不是函数,是重载了()操作符的对象,只是表现和函数相似。

最新文章

  1. android-配置文件AndroidManifest.xml
  2. 人工智能之一《tensorflow》
  3. C# 操作office知识点汇总
  4. Google搜索质量评估员指南
  5. 十五、Android学习笔记_授权过程
  6. Android学习之旅:五子棋
  7. GCC 命令行详解 -L 指定库的路径 -l 指定需连接的库名(转载)
  8. 移动端touchstar、touchmove、touchend 事件如果页面有滚动时不让触发 touchend 事件。
  9. input中range相关操作
  10. centos7 部署 ELK 日志系统
  11. MySQL中的查询子句
  12. 英语口语练习系列-C12-不了解
  13. Ubuntu LNMP系统搭建Zabbix监控
  14. c#实现数据库的备份
  15. Docker Dockerfile指令
  16. 推荐几款在Windows中比较好用的软件
  17. 回归JavaScript基础(三)
  18. HTML中添加&lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge,chrome=1&quot;&gt;
  19. BZOJ 4726 POI 2017 Sabota? 树形DP
  20. Kafka Shell基本命令

热门文章

  1. [深度学习] 基于切片辅助超推理库SAHI优化小目标识别
  2. 微服务框架——SpringBoot
  3. Flutter新版本2.X系列--01创建项目
  4. 解决node.js报错Invalid character in header content [&quot;Content-Disposition&quot;]
  5. vulnhub靶场之RIPPER: 1
  6. RocketMQ Streams 1.1.0: 轻量级流处理再出发
  7. Timer的定时调度函数schedule的四种用法
  8. 可能是最简单的本地GPT3 对话机器人,支持OpenAI 和 Azure OpenAI
  9. 线程基础知识17 Quene
  10. ECharts 饼图切换数据源bug 开始没数据显示 切换或刷新后显示