C++11lambda表达式

程昱
• 阅读 4582

1. lambda的申明方式

Lambda表达式是c++11的新特性,它允许程序员在函数内部创建一个匿名函数,对于一些小型的功能模块,可以使用lambda表达式来实现。很多其他语言已经有了lambda表达式,比如objective-c中block就类似。

Lambda表达式的声明方式:

例如:

auto fadd = [](int a, int b)
{
    return a + b;
};

Fadd就是一个匿名函数,后面是它的实现,auto是自动类型,也是c++11新加入的特性,auto可以自动判断类型。[]表示开始定义lambda表达式,他可以带参数,()里面的是函数的参数, {}体内的是函数体。这里函数的返回值隐含了,也可以指明函数的返回值。例如

显示指明返回值,采用:

auto fadd = [](int a, int b)->int
{
    return a + b;
};

总结:lambda表达式的申明形势为

[captures] (params) -> ret {Statments;}

2. lambda表达式的变量截取

考虑这样一种情况,加入你的lambda表达式需要使用外部变量,那该怎么办呢?lambda表达式提供了变量截取的功能。

例如:

int val = 1;
auto fadd = [&](int a, int b)->int
{

   return val = a + b + val;

};
cout << fadd(2, 3) <<endl;
cout << "val = " << val<< endl;

val是外部变量,如果在fadd中需要访问val,必须在[]中指明截取方式,这里用的&表示截取外部作用域中所有变量,并作为引用在函数体中使用。

Lambda表达式中有多种变量截取方式。

下面是各种变量截取的选项:

  • [] 不截取任何变量
  • [&} 截取外部作用域中所有变量,并作为引用在函数体中使用
  • [=] 截取外部作用域中所有变量,并拷贝一份在函数体中使用
  • [=, &foo] 截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对foo变量使用引用
  • [bar] 截取bar变量并且拷贝一份在函数体重使用,同时不截取其他变量
  • [this] 截取当前类中的this指针。如果已经使用了&或者=就默认添加此选项。
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java 8 lambda表达式中的异常处理
java8lambda表达式中的异常处理简介java8中引入了lambda表达式,lambda表达式可以让我们的代码更加简介,业务逻辑更加清晰,但是在lambda表达式中使用的FunctionalInterface并没有很好的处理异常,因为JDK提供的这些FunctionalInterface通常都是没有抛出异常的,这意味着需要我们自
Irene181 Irene181
4年前
Python 之父为什么嫌弃 lambda 匿名函数?
Python支持lambda匿名函数,其扩展的BNF表示法是lambdaexpr::"lambda"parameterlist":"expression,也就是lambda参数序列:表达式。这是一种便捷的函数定义方式,若翻译成我们熟知的函数形式,会是这个样子:def <lambda(parameterlist):    retu
Irene181 Irene181
4年前
Python 之父为什么嫌弃 lambda 匿名函数?
Python支持lambda匿名函数,其扩展的BNF表示法是lambdaexpr::"lambda"parameterlist":"expression,也就是lambda参数序列:表达式。这是一种便捷的函数定义方式,若翻译成我们熟知的函数形式,会是这个样子:def <lambda(parameterlist):    retu
Stella981 Stella981
3年前
Lambda表达式中Collections的接口有哪些变化?
我们先从最熟悉的\Java集合框架(JavaCollectionsFramework,JCF)\开始说起。为引入Lambda表达式,Java8新增了java.util.function包,里面包含常用的函数接口,这是Lambda表达式的基础,Java集合框架也新增部分接口,以便与Lambda表达式对接。首先回顾一下Java集合框架的接口继承
Wesley13 Wesley13
3年前
Java8特性
Java8又称jdk1.8。主要新特性:Lambda表达式 −Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中。方法引用 −方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
Wesley13 Wesley13
3年前
Java8
  不管lambda表达式还是Stream流式编程,Function、Consumer、Supplier、Predicate四个接口是一切函数式编程的基础。下面我们详细学习这四个巨头,interfaceSupplier<T    该接口的中文直译是“提供者”,可以理解为定义一个lambda表达式,
Wesley13 Wesley13
3年前
Java8 新增特性 Lambda表达式
               聊聊Lambda  背景:    早在2014年oracle发布了jdk8,在里面增加了lambda模块。于是java程序员们又多了一种新的编程方式:函数式编程,也就是lambda表达式。    以下整理关于Lambda表达式资料(转载地址:https:/
Wesley13 Wesley13
3年前
Java 8中你可能没听过的10个新特性
lambda表达式,lambda表达式,还是lambda表达式。一提到Java8就只能听到这个,但这不过是其中的一个新功能而已,Java8还有许多新的特性——有一些功能强大的新类或者新的用法,还有一些功能则是早就应该加到Java里了。这里我准备介绍它的10个我个人认为非常值得了解的新特性。总会有一款适合你的,开始来看下吧。default方法
Wesley13 Wesley13
3年前
Java 8 Lambda表达式的使用
lambda表达式允许你通过表达式来代替功能接口。lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。Lambda表达式还增强了集合库。JavaSE8添加了2个对集合数据进行批量操作的包:java.util.function包以及java.util.stre
Wesley13 Wesley13
3年前
Java8—一万字的Lambda表达式的详细介绍与应用案例
  基于Java8详细介绍了lambda表达式的语法与使用,以及方法引用、函数式接口、lambda复合等Java8的新特性!文章目录1Lambda的概述2函数式接口2.1Consumer消费型接口2.2Supplier供给型接口2.3Function<T,R函数型接口
Wesley13 Wesley13
3年前
Java 8 stream 实战
概述平时工作用python的机会比较多,习惯了python函数式编程的简洁和优雅。切换到java后,对于数据处理的『冗长代码』还是有点不习惯的。有幸的是,Java8版本后,引入了Lambda表达式和流的新特性,当流和Lambda表达式结合起来一起使用时,因为流申明式处理数据集合的特点,可以让代码变得简洁易读。幸福感爆棚,有没有!本文主要列举一些