C++ 在函数中定义函数
文章目录
- 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++ 在函数中定义函数相关推荐
- c++ 函数中定义函数
// 借用类,在类中定义函数 1 #include <iostream> 2 3 int main(int argc, char* argv[]) 4 { 5 class { 6 prot ...
- 在JavaScript函数中定义全局变量
是否可以在JavaScript函数中定义全局变量? 我想在其他函数中使用trailimage变量(在makeObj函数中声明). <html xmlns="http://www.w3. ...
- python中定义函数常用关键字_Python 中定义函数的关键字是 _________________ 。_学小易找答案...
[其它]实验4-串和数组-实验任务书.docx [填空题]表达式 'abc' in ['abcdefg'] 的值为______________. [填空题]已知 x = range(1,4) 和 y ...
- scala 函数中嵌套函数_Scala函数–声明,定义,调用和嵌套函数
scala 函数中嵌套函数 A function is a set of statements combined together to perform a specific task. The co ...
- c++语言程序中,要调用的函数必须在main()函数中定义,惠州学院C++考试复习题
惠州学院C++复习题 一.选择题 1.C++的源文件的扩展名是_____C____. A.h B.obj C.cpp D.exe 2.下列选项能够作为C++变量名的是___C____. A.false ...
- C语言中的指针应用,函数指针,指针函数,结构体中定义函数指针。
指针函数 指针函数就是一个返回指针的函数,其本质是一个函数,该函数的返回值是一个指针. 声明一个指针函数 int* fun(int x,int y); 例子 typedef struct _Data{ ...
- 声明一个Tree(树)类,有成员ages(树龄),成员函数grow(int years)用以对ages 加上years,showage( )用以显示tree对象的ages值。在主函数中定义Tree类对
//声明一个Tree(树)类,有成员ages(树龄), //成员函数grow(int years)用以对ages 加上years //,showage()用以显示tree对象的ages值. //在主函 ...
- main c语言中变量的定义,C语言中在main函数中定义的变量是全局变量么_后端开发...
PHP 和 JavaSript 区别_后端开发 PHP是一种创建动态交互性站点的强有力的服务器端脚本语言,主要用于Web开发领域,而JavaSript是一种具有函数优先的轻量级,解释型或即时编译型的高 ...
- Python中定义函数的关键字是什么?一起来学习下吧
python中定义函数的关键字是def. Python使用def关键字开始函数定义,紧接着是函数名,括号内部为函数的参数,内部为函数的具体功能实现代码,如果想要函数有返回值, 在expressions ...
最新文章
- Linux学习记录-11
- MySql 的一些使用小技巧
- 解决 Angular 官网下载的库 Schematics 执行 npm run build 时遇到的编译错误
- 開源搜索引擎爬蟲_六大開源搜索引擎工具 | 學步園
- 【ACL2020】五篇与文本理解相关的论文
- 「Java工具类」Apache的FileUtils和IOUtils工具类
- YOLO系列详解:YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5
- new115.com dz.html,超实用的HTML代码段(赵荣娇)
- svchost.exe网速占用解决办法
- RAW怎么转为JPG?这些转换技巧值得收藏
- 【IJCAI 2020】如何看待 IJCAI 2020 summary reject阶段拒稿近一半?
- Twitter相关功能集成
- js reduce 累加数组里对象某个属性的和 NaN
- 计算机系统结构的分类-复杂指令集系统CISC与精简指令集系统RISC
- sql 数据与程序的物理独立性和逻辑独立性
- 微信小程序 —— 倒计时(展示时钟)
- 智能门禁系统教程--人脸识别方案
- mp4格式怎么转换成gif格式?简单3步完成视频制作gif
- C#数据库插入多条数据,抛出异常:另一个 SqlParameterCollection 中已包含 SqlParameter
- [转载]Android开发真实谎言:个人无空间 无奈搞吸费
热门文章
- TinyXML-2解析XML数据
- C语言strcpy_s 和strncpy_s的用法,以及函数实现的方法
- 内存分为几个部分?堆与栈的区别
- 神经网络——Conv2d的使用
- ORACLE 启动报错 ORA-00600: internal error code, arguments
- VMD/NAMD命令/规则
- Python实现BP神经网络ANN单隐层分类模型项目实战
- M5Product: Self-harmonized Contrastive Learning for E-commercial Multi-modal Pretraining 论文解读
- MFC生成错误msado15.tlh(3991):fatal error C1003: 错误计数超过100;正在停止编译
- RTCP(一): RR--Receiver Reports 接收者报告