C11新特性六 —— lambda表达式
文章目录
- lambda 表达式
- 1. lambda表达式语法
- 2. lambda表达式特点
lambda 表达式
lambda表达式 表示一个可调用的代码单元,没有命名的内联函数,不需要函数名因为我们仅是一次性的使用,不需要在 其他地方进行调用。
1. lambda表达式语法
[capture list](parameter list) -> return type {function body}
// [捕获列表](参数列表) -> 返回类型 {函数体}
// 只有[capture list] 和 {function body} 是必选的auto lam = []() -> int {cout << "Hello World!"; return 88;};
auto ret = lam();
cout << ret << endl; //输出88
-> int
:表示此匿名函数返回int, 大多数情况下 lambda表达式的返回值可由编译器猜测得出,因此不需要我们指定返回值类型。
2. lambda表达式特点
(1) 变量捕获才是成就lambda表达式的秘方
① [] 不捕获任何变量,这种情况下lambda表达式内部不能访问外部的变量
② [&] 以引用方式捕获所有变量 (保证lambda执行时,变量存在)
③ [=] 用值的方式捕获所有变量 (创建时拷贝,修改时对lambda内对象无影响)
④ [=, &foo] 以引用捕获变量foo,但其余变量都靠值捕获
⑤ [&, foo] 以值捕获foo,但其余变量都靠引用捕获
⑥ [bar] 以值方式捕获bar;不捕获其他变量
⑦ [this] 捕获所在类的this指针
int a = 1, b = 2, c = 3;
auto lam2 = [&, a]() { // b, c 以引用捕获,a以值捕获b = 5;c = 3; // a = 1; a不能赋值cout << a << b << c << endl;
}
void fcn() { // 值捕获size_t v1 = 42;auto f = [v1] {return v1;};v1 = 0;auto j = f(); // j = 42; 创建时拷贝、修改对lambda内对象无影响
}
void fcn() { // 可变lambdasize_t v1 = 42;auto f = [v1] () mutablem {return ++v1;}; // 修改值捕获可以加mutablev1 = 0;auto j = f(); // j = 43;
}
void fcn() { //引用捕获size_t v1 = 42; // 非constauto f = [&v1] () {return ++v1;};v1 = 0;auto j = f(); //注意此时 j = 1;
}
lambda 最大的一个优势是在使用STL中的算法(algorithms)库
例如: 数组排序
int arr[] = {6, 4, 3, 2, 1, 5};
bool compare(int& a, int& b) { // 谓词函数return a > b;
}
std::sort(arr, arr+6, compare);// lambda表达式形式
std::sort(arr, arr + 6, [](const int&a, const int& b) {return a > b;});// 降序排序
std::for_each(begin(arr), end(arr), [](const int& e) {cout<< "After:" << e << endl;});
// 6, 5, 4, 3, 2, 1
C11新特性六 —— lambda表达式相关推荐
- Java8 新特性:Lambda 表达式、方法和构造器引用、Stream API、新时间与日期API、注解
Java8新特性:Lambda 表达式.方法和构造器引用.Stream API.新时间与日期API.注解 1.Java8新特性 1.1.主要的新特性: 1.2.编程风格 2.Lambda 表达式 2. ...
- java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合
java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合 比如,我有一张表: entity Category.java service CategoryServic ...
- JDK8新特性之Lambda表达式
转载自 JDK8新特性之Lambda表达式 什么是Lambda表达式 Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁.当开发者在编写Lambda表达式时,也会随之被编译成 ...
- 【java8新特性】——lambda表达式与函数式接口详解(一)
一.简介 java8于2014年发布,相比于java7,java8新增了非常多的特性,如lambda表达式.函数式接口.方法引用.默认方法.新工具(编译工具).Stream API.Date Time ...
- java8新特性之lambda表达式--超级详细版本
java8新特性之lambda表达式 1.什么是lambda表达式?为什么用它? 2. 为什么Java需要lambda表达式? 3. lambda表达式的语法 4.函数式接口 4.1 什么是函数式接口 ...
- 深圳Java培训学习:Java8.0新特性之Lambda表达式--【千锋】
深圳Java培训学习:Java8.0新特性之Lambda表达式–[千锋] 前言 Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.本篇文章,主要给大家介绍的是lambda表 ...
- java x=8_Java8新特性之lambda表达式
简介 Java8带来的新特性之一Lambda表达式,又称之为函数式编程,核心思想是将面向对象中的传递对象变为传递行为 语法 expression = (variable) -> anction ...
- lambda 对象去重_最火的java8新特性:Lambda 表达式
主要内容 1. Lambda 表达式 2. 函数式接口 3. 方法引用与构造器引用 4. Stream API 5. 其他新特性 Java 8新特性简介 速度更快 代码更少(增加了新的语法 Lambd ...
- JDK 8 新特性 之 Lambda表达式
前言 Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为参数传递进方法中. 使用 Lambda 表达式可以使代码变的更加简洁紧凑. lamb ...
最新文章
- WebGoat教程学习(三)--Ajax安全
- oppor17android版本,OPPOR17ColorOS系统怎么样
- 面试官问你想找什么工作_找工作时如何面试面试官
- 源码测评:来客推开发源码能用来做什么模式的商城?B2B2C?S2B2C?云集模式?淘宝模式?
- 数组常用解题方法(持续更新)
- MDaemon使用技巧大全--新建账户欢迎文件的设置
- Codeigniter 获取当前的控制器名称和方法名称
- c语言怎么让两个函数同时进行_Excel高级筛选怎么用同时满足多个条件进行筛选...
- mybatis执行批量更新batch update 的方法(oracle,mysql)
- php多级查询,MySQL 多级查询
- Pandas系列(十二)实现groupby分组统计
- gitlab+jenkins+maven+docker持续集成(二)——maven安装配置
- AI红包皮速领,人类现金速抽|祝大家新春快乐
- 阿里企业邮箱的POP地址
- spring data JPA常用注解
- 深度学习-图片识别(上)
- 去法国,买哪些伴手礼既有面子又不破费
- 【社媒营销】四大跨境营销渠道分析
- 你听播客吗?聊聊最近大火的声音经济
- Redis-benchmark性能测试工具使用详解
热门文章
- 如何伦敦金走势图中的涨跌规律
- Linux桌面新版宠物Mint 10正式发布
- O’Reilly动物书系列
- Python——sqlalchemy.exc.ArgumentError
- python三局游戏游戏代码_Python实现忍让三局交换码的自动采集,python,忍三,游戏,兑换,全族,领取...
- 全面屏惊艳!大神制作 iPhone 8开箱视频来了
- 打印时提示计算机的内存不足,电脑中使用惠普P4510打印机打印时出现内存不足怎么处理...
- “大闸蟹” 英语怎么说?
- 突然怀念小时弹玻璃球的日子
- 一封史上最牛的求职信!