问题引入

使用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表达式)的更多相关文章

  1. Qt中使用匿名函数lambda表达式

    一.为什么要使用匿名函数lamdba 首先,lambda表达式可以使代码变得简单,C++中,一个lambda表达式表示一个可调用的代码单元.如代码: #include <QCoreApplica ...

  2. 【Unity|C#】基础篇(9)——匿名函数 / Lambda表达式

    [学习资料] <C#图解教程>(第13章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.baidu. ...

  3. Python中的匿名函数lambda的用法

    一.lambda函数的简介  对lambda函数,它其实是一个类似于def的函数,只不过lambda是一个不需要定义函数名的匿名函数.当我们在有些时候,需要做一些简单的数学计算时,如果定义一个def函 ...

  4. 匿名函数 lambda表达式(lambda expression)

    阅读g2log时,发现有两行代码居然看不懂. 1. auto bg_call =  [this, log_directory]() {return pimpl_->backgroundChang ...

  5. (28)C#委托,匿名函数,lambda表达式,事件

    一.委托 委托是一种用于封装命名和匿名方法的引用类型. 把方法当参数,传给另一个方法(这么说好理解,但实际上方法不能当参数,传入的是委托类型),委托是一种引用类型,委托里包含很多方法的引用 创建的方法 ...

  6. Python匿名函数——lambda表达式

    如果要定义的函数很简单,一个return语句就能搞定,可以使用lambda表达式来定义, lambda表达式的语法如下: lambda parameters: expression lambda表达式 ...

  7. 【C#】委托中的匿名函数与lambda

    将方法作为方法的参数 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使 ...

  8. python做中学(八)匿名函数lambda的用法

    匿名函数,顾名思义即没有名称的函数,和def定义的函数的最大区别在于匿名函数创建后返回函数本身(即匿名函数不需要return来返回值),表达式本身结果就是返回值,而def创建后则赋值给一个变量名,在P ...

  9. 匿名函数(lambda)在列表生成式和生成器中的应用示例

    匿名函数(lambda)在列表生成式和生成器中的应用示例 列表生成式中实例 先看题: 以下代码的输出是什么?请给出答案并解释: def func(): return [lambda x: x * i ...

  10. 匿名函数 =匿名方法+ lambda 表达式

    匿名函数的定义和用途 匿名函数是一个"内联"语句或表达式,可在需要委托类型的任何地方使用. 可以使用匿名函数来初始化命名委托[无需取名字的委托],或传递命名委托(而不是命名委托类型 ...

随机推荐

  1. linux配置本地yum源实现在局域网中在线安装软件包

    安装linux下安装软件需要安装一系列的rpm包,用rpm -ivh xx和yum install xx 如果用rpm安装软件包的时候,需要自己下载rpm安装包,如果rpm包不全总是提示依赖检查失败或 ...

  2. forms组件渲染标签、展示信息、校验数据的一些补充,forms组件参数和源码剖析,modelform组件,Django中间

    今日内容 forms组件渲染标签 forms组件渲染标签的方式1 <p>forms组件渲染标签的方式1</p> {{ form_obj.as_p }} {{ form_obj. ...

  3. 最最最常用的Git提交规范以及常用命令总结

    提交规范 为什么要制定提交规范? 便于对提交历史进行追溯,以及快速定位 代码改动的历史更加清晰 格式化的 Commit Message 才可以用于自动化输出 Change log 如何制定提交规范? ...

  4. 被iframe页面更改顶层的跳转链接

    界面被其他网页Iframe,需要修改顶层链接---方法如下 <!DOCTYPE html> <html lang="en"> <head> &l ...

  5. eosio.cdt发布带来的变化

    change of version 1.3.x+,EOSIO.CDT After eos version 1.3.x, generation of cdt tools, Smart Contracts ...

  6. Time Series Analysis (Best MSE Predictor & Best Linear Predictor)

    Time Series Analysis Best MSE (Mean Square Error) Predictor 对于所有可能的预测函数 \(f(X_{n})\),找到一个使 \(\mathbb ...

  7. Pytest插件pytest-assume多重断言

    Pytest插件pytest-assume多重断言 背景 import pytest def test_assume1(): assert 1 == 2 print('hello') assert 2 ...

  8. VMware虚拟机的简单安装和配置

    一.简单了解虚拟机 虚拟机英文名(Virtual Machine)是通过软件模拟的完整计算机系统.在实体计算机中能够完成的工作在虚拟机中都能够实现.在计算机中创建虚拟机时,需要将实体机的部分硬盘和内存 ...

  9. 学习Java Day6

    今天学习了Java的输出,与C/C++不同,Java的输出形式有很多,有许多printf标识符表示的含义各不相同,而且数量众多,其中Java还有表示日期的转换符.

  10. 《深入理解java虚拟机》第七章读书笔记——虚拟机类加载机制

    系列文章目录和关于我 一丶虚拟机类加载机制是什么 java虚拟机将描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可用被虚拟机直接使用的java类型. 二丶类加载时 ...