文章目录

  • Part.I 实例
  • Part.II 解释
    • Chap.I Lambda 表达式

C++在函数中也能定义函数?当让不可能,但是定义函数对象却是可以的。如果用旧的方法定义一个函数对象,那就要自己编写一个函数类,这样不够方便。但是C++ 11发布后,在函数内简便地定义“函数”(其实是『函数对象』)成为了可能。

Part.I 实例

下面是一个简单的样例,其中在main函数内部定义了两个『函数对象』,一个是print 用来打印二维vector;另一个是cmp用来为sort函数提供排序标准,即根据第二个元素的大小从大到小排列。

#include <iostream>
#include <algorithm>
#include <vector>using namespace std;int main()
{auto print = [](vector<vector<int>> a) {for(int i=0;i<a.size();i++) {for(int j=0;j<a[i].size();j++)cout<<a[i][j]<<" ";cout<<endl;}};vector<vector<int>> A;vector<int> B({1,2}); A.push_back(B);B=vector<int>({2,1}); A.push_back(B);B=vector<int>({3,6}); A.push_back(B);cout<<"----------Origin---------"<<endl;print(A);auto cmp = [](const vector<int> a, const vector<int> b){return a[1]>b[1];};sort(A.begin(), A.end(), cmp);cout<<"----------After Sorted---------"<<endl;print(A);getchar();return 0;
}

结果输出为:

----------Origin---------
1 2
2 1
3 6
----------After Sorted---------
3 6
1 2
2 1

Part.II 解释

对于这种写法的解释:

  • 上面代码中的auto并不是旧标准中自动变量的意思(自动分配和自动释放空间),它在C++ 11中赋予了新的功能:当变量被声明时,从变量的初始化值中推出并指定变量的类型。
  • auto print = [](xx) { };是一个省去-> ret 的 Lambda 表达式,下面会详细介绍Lambda 表达式。
  • Lambda由于产生的是无名的函数对象,所以它并不能直接在函数中被调用。但如果『把这无名的函数对象起个别名』,那么就可以通过别名来调用了。

Chap.I Lambda 表达式

参考:http://c.biancheng.net/view/3741.html

lambda 来源于函数式编程的概念,也是现代编程语言的一个特点。C++11 终于把 lambda 加入了进来。

lambda表达式有如下优点:

  • 声明式编程风格:就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或者函数对象。以更直接的方式去写程序,好的可读性和可维护性。
  • 简洁:不需要额外再写一个函数或者函数对象,避免了代码膨胀和功能分散,让开发者更加集中精力在手边的问题,同时也获取了更高的生产率。
  • 在需要的时间和地点实现功能闭包,使程序更灵活。

lambda 表达式定义了一个匿名函数,并且可以捕获一定范围内的变量。lambda 表达式的语法形式可简单归纳如下:

[ capture ] ( params ) opt -> ret { body; };

其中

  • capture 是捕获列表,空表示不捕获任何变量;&表示捕获外部作用域中所有变量,并作为引用在函数体中使用(按引用捕获);=表示捕获外部作用域中所有变量,并作为副本在函数体中使用(按值捕获);=,&foo表示按值捕获外部作用域中所有变量,并按引用捕获 foo 变量。bar按值捕获 bar 变量,同时不捕获其他变量;this表示捕获当前类中的 this 指针,让 lambda 表达式拥有和当前类成员函数同样的访问权限。如果已经使用了 & 或者 =,就默认添加此选项。捕获 this 的目的是可以在 lamda 中使用当前类的成员函数和成员变量。
  • params 是参数表,
  • opt 是函数选项,
  • ret 是返回值类型,
  • body是函数体

C++ 在函数中定义函数相关推荐

  1. c++ 函数中定义函数

    // 借用类,在类中定义函数 1 #include <iostream> 2 3 int main(int argc, char* argv[]) 4 { 5 class { 6 prot ...

  2. 在JavaScript函数中定义全局变量

    是否可以在JavaScript函数中定义全局变量? 我想在其他函数中使用trailimage变量(在makeObj函数中声明). <html xmlns="http://www.w3. ...

  3. python中定义函数常用关键字_Python 中定义函数的关键字是 _________________ 。_学小易找答案...

    [其它]实验4-串和数组-实验任务书.docx [填空题]表达式 'abc' in ['abcdefg'] 的值为______________. [填空题]已知 x = range(1,4) 和 y ...

  4. scala 函数中嵌套函数_Scala函数–声明,定义,调用和嵌套函数

    scala 函数中嵌套函数 A function is a set of statements combined together to perform a specific task. The co ...

  5. c++语言程序中,要调用的函数必须在main()函数中定义,惠州学院C++考试复习题

    惠州学院C++复习题 一.选择题 1.C++的源文件的扩展名是_____C____. A.h B.obj C.cpp D.exe 2.下列选项能够作为C++变量名的是___C____. A.false ...

  6. C语言中的指针应用,函数指针,指针函数,结构体中定义函数指针。

    指针函数 指针函数就是一个返回指针的函数,其本质是一个函数,该函数的返回值是一个指针. 声明一个指针函数 int* fun(int x,int y); 例子 typedef struct _Data{ ...

  7. 声明一个Tree(树)类,有成员ages(树龄),成员函数grow(int years)用以对ages 加上years,showage( )用以显示tree对象的ages值。在主函数中定义Tree类对

    //声明一个Tree(树)类,有成员ages(树龄), //成员函数grow(int years)用以对ages 加上years //,showage()用以显示tree对象的ages值. //在主函 ...

  8. main c语言中变量的定义,C语言中在main函数中定义的变量是全局变量么_后端开发...

    PHP 和 JavaSript 区别_后端开发 PHP是一种创建动态交互性站点的强有力的服务器端脚本语言,主要用于Web开发领域,而JavaSript是一种具有函数优先的轻量级,解释型或即时编译型的高 ...

  9. Python中定义函数的关键字是什么?一起来学习下吧

    python中定义函数的关键字是def. Python使用def关键字开始函数定义,紧接着是函数名,括号内部为函数的参数,内部为函数的具体功能实现代码,如果想要函数有返回值, 在expressions ...

最新文章

  1. Linux学习记录-11
  2. MySql 的一些使用小技巧
  3. 解决 Angular 官网下载的库 Schematics 执行 npm run build 时遇到的编译错误
  4. 開源搜索引擎爬蟲_六大開源搜索引擎工具 | 學步園
  5. 【ACL2020】五篇与文本理解相关的论文
  6. 「Java工具类」Apache的FileUtils和IOUtils工具类
  7. YOLO系列详解:YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5
  8. new115.com dz.html,超实用的HTML代码段(赵荣娇)
  9. svchost.exe网速占用解决办法
  10. RAW怎么转为JPG?这些转换技巧值得收藏
  11. 【IJCAI 2020】如何看待 IJCAI 2020 summary reject阶段拒稿近一半?
  12. Twitter相关功能集成
  13. js reduce 累加数组里对象某个属性的和 NaN
  14. 计算机系统结构的分类-复杂指令集系统CISC与精简指令集系统RISC
  15. sql 数据与程序的物理独立性和逻辑独立性
  16. 微信小程序 —— 倒计时(展示时钟)
  17. 智能门禁系统教程--人脸识别方案
  18. mp4格式怎么转换成gif格式?简单3步完成视频制作gif
  19. C#数据库插入多条数据,抛出异常:另一个 SqlParameterCollection 中已包含 SqlParameter
  20. [转载]Android开发真实谎言:个人无空间 无奈搞吸费

热门文章

  1. TinyXML-2解析XML数据
  2. C语言strcpy_s 和strncpy_s的用法,以及函数实现的方法
  3. 内存分为几个部分?堆与栈的区别
  4. 神经网络——Conv2d的使用
  5. ORACLE 启动报错 ORA-00600: internal error code, arguments
  6. VMD/NAMD命令/规则
  7. Python实现BP神经网络ANN单隐层分类模型项目实战
  8. M5Product: Self-harmonized Contrastive Learning for E-commercial Multi-modal Pretraining 论文解读
  9. MFC生成错误msado15.tlh(3991):fatal error C1003: 错误计数超过100;正在停止编译
  10. RTCP(一): RR--Receiver Reports 接收者报告