C++:函数指针进阶(三):Lambda函数详解
1:Lambda函数语法
C++ 语法的基本格式为:
[capture](parameters) -> return_type { /* ... */ }
(1) [capture] :[]内为外部变量的传递方式,值、引用等,如下
[] //表示的是在lambda定义之前的域,对外部参数的调用;
[=] //表示外部参数直接传值
[&] //表示外部参数传引用,可修改值。当默认捕获符是 & 时,后继的简单捕获符必须不以 & 开始。而当默认捕获符是 = 时,后继的简单捕获符必须以 & 开始。
[x, &y] //x is captured by value, y is captured by reference
[&, x] //x is explicitly captured by value. Other variables will be captured by reference
[=, &z] //z is explicitly captured by reference. Other variables will be captured by value(2)(parameters) :()内为形参,和普通函数的形参一样。
(3)-> return_type:->后面为lambda函数的返回类型,如
-> int
、-> string
等。一般情况下,编译器推出lambda函数的返回值,所以这部分可以省略不写。(4){ /* … */ }: {}内为函数主体,和普通函数一样。
举例:定义 lambda函数
auto add = [](int a,int b) ->int { return a + b; };
此处为 lambda函数定义,所以左边为函数指针类型变量,一般懒的写函数指针类型,可以直接赋值给 auto类型变量。
lambda函数使用、运行
方法一:直接用 auto 变量接收 lambda函数返回值
auto add = [](
int
a,
int
b) ->
int
{
return
a + b; };
int
result = add(1,2);
方法二:定义函数指针接收 lambda函数返回值
auto add = [](int a,int b) ->int { return a + b; };
int(*func_ptr)(int,int) = add ;
int result = func_ptr(1,2);
2:Lambda表达式应用实例
lambda表达式原理: 就是函数对象更高级的实现!
现在我们看一下:通过 Lambda表达式对 Vector进行排序
// main.cpp#include<vector>
#include<algorithm>
#include<iostream>
int main() {std::vector<int> vec;for (int i = 0; i < 3; i++){vec.push_back(i);}// 定义lambda比较器传给 sort函数做比较.做降序排列(注意 sort函数默认阿是升序排列的)std::sort(vec.begin(), vec.end(), [](int a, int b)->bool {return a > b;});//打印比较后的结果for (int val : vec) {std::cout << val << std::endl;}}// 打印结果
2
1
0
总结:前两篇我们分析了:函数指针,函数对象指针,Lambda表达式用法,这三种情况下,其实代码还是比较繁琐复杂的,那么我们可以想一下,是否可以有一种简单的技术,来把这些情况都包含起来了 ?按照面向对象的思想,来处理这些情况了 ? 有的,C++中 std::function 这个类就是可以实现。
std::function是C++标准库中的一个模板类,用来保存一个函数、仿函数或lambda表达式。
好,下篇文章我们就分析 C++ 标准库中 这个模板类。
C++:函数指针进阶(三):Lambda函数详解相关推荐
- 函数指针的用法以及用途详解
在C++中,指针是一个核心的部分,常规的指针用法作者已经在另外一篇文章中有过详细介绍,这篇文章主要是针对函数指针进行讨论. 首先我们先来认识一下函数指针的概念,我们平时在写函数的时候,调用函数时总是以 ...
- js 将内部函数变成全局函数_js中三种作用域详解(全局,函数,块级)
1.全局变量:声明在函数外部的变量(所有没有var直接赋值的变量都属于全局变量) 2.局部变量:声明在函数内部的变量(所有没有var直接赋值的变量都属于全局变量) JS中变量申明分显式申明和隐式申明. ...
- Replication进阶(三) 复制心跳详解
心跳 心跳,这个词在不同人的脑袋里,第一反应会想到不同的东西,比如说医护人员,想到的是 '砰~砰~砰~';linux网络编程的人想到可能是客户端与服务端的探活机制,比如TCP协议的心跳,或者应用层自己 ...
- C语言基础10——指针进阶。字符指针、指针数组、数组指针、函数指针、函数指针数组、回调函数、数组名详解、杨氏矩阵、字符串旋转
目录 字符指针 指针数组 数组指针 数组传参.指针参数 函数指针 函数指针数组 指向函数指针数组的指针 回调函数 练习 数组名的意义 指针笔试题 字符指针 字符指针的另一种使用方式 #include ...
- 详解函数指针和类成员函数指针
作者:倾夜·陨灭星尘 一.什么是函数指针? 函数指针,顾名思义即指向函数的指针. 如果要问,为什么能用一个指针指向一个函数呢?我觉得要理解这个问题,以及要理解后面的函数指针和类成员函数指针,没有什么比 ...
- 指针详解(包含指针,指针数组,数组指针,指向数组指针的指针,函数指针,函数指针数组,指向函数指针数组的指针)
大家都知道,指针有双面性,灵活度高,但是运用时一定要避免野指针和空指针的出现.否则会出现一些意想不到的错误.话不多说,看下面的代码: int main() {int arr[10] = { 0 };/ ...
- C语言指针的那些事:第三篇(函数指针,指针函数,函数指针数组,指向函数指针数组的指针)
文章目录 1. 函数指针 1)函数指针的例题 2. 指针函数 3. 函数指针数组 1)函数指针数组的用途 4. 指向函数指针数组的指针 5. 一些后话 1. 函数指针 函数指针就是指向函数的指针:本质 ...
- 三种函数指针的表达以及函数指针概念讲解
三种函数指针的表达以及函数指针概念讲解 函数指针的概念 三种表达函数指针的方法 函数指针的概念 如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为 ...
- 定时器 槽函数没执行_Web服务器项目详解 07 定时器处理非活动连接(上)
点击"两猿社" 关注我们 Web服务器详解目录 00 项目概述 01 线程同步机制包装类 02 半同步/半反应堆线程池(上) 03 半同步/半反应堆线程池(下) 04 http连接 ...
- c++ lambda函数_C++11 之 lambda函数的详细使用
1. lambda 函数概述 lambda 表达式是一种匿名函数,即没有函数名的函数:该匿名函数是由数学中的λ演算而来的.通常情况下,lambda函数的语法定义为: [capture] (parame ...
最新文章
- Android应用程序窗口(Activity)的测量(Measure)、布局(Layout)和绘制(Draw)过程分析(上)...
- Go-实现猜数字游戏代码
- ActionRequestValidationException[Validation Failed: 1: script or doc is missing
- python编程小游戏-python趣味入门——写几个常玩的游戏
- 分治法:快速排序,3种划分方式,随机化快排,快排快,还是归并排序快?
- Python小游戏(XO大战)
- 浅析Hadoop文件格式
- java后台代码添加超链接_Java 添加超链接至Excel文档
- LTE学习:天线端口数目和物理天线数目关系
- )类 新建javafx程序时_CML Copley提供的运动控制程序开发类库
- Android 保持屏幕常亮
- Struts action-mapping 元素讲解
- [含论文+答辩PPT+任务书+中期检查表+源码等]S2SH洋酒销售系统|商城
- 阻滞增长模型求解_阻滞增长模型logistic模型.ppt
- SAP VK11 报错“条件不能创建在分销渠道 10 中”
- 绕过tp路由器管理密码_TP-Link路由器登录密码怎么重置【详细介绍】
- 4199 公约数(求解约数 + 最大公约数 + 二分)
- 重启服务器后docker wordpress “Error establishing a database connection”解决办法
- element ui自定义图标
- 网站SEO实践之 - seo引流怎么选有流量的关键词