C++ lambda函数

【1】lambda表达式语法定义

  lambda表达式的语法定义如下:

  [capture] (parameters) mutable ->return-type {statement};

  (1) [capture]: 捕捉列表。捕捉列表总是出现在lambda函数的开始处。实质上,[]是lambda引出符(即独特的标志符)

  编译器根据该引出符判断接下来的代码是否是lambda函数

  捕捉列表能够捕捉上下文中的变量以供lambda函数使用

  捕捉列表由多个捕捉项组成,并以逗号分隔,捕捉列表一般有以下几种形式:

  <1> [var] 表示值传递方式捕捉变量var

  <2> [=] 表示值传递方式捕捉所有父作用域的变量(包括this指针)

  <3> [&var] 表示引用传递捕捉变量var

  <4> [&] 表示引用传递捕捉所有父作用域的变量(包括this指针)

  <5> [this] 表示值传递方式捕捉当前的this指针

  <6> [=,&a,&b] 表示以引用传递的方式捕捉变量 a 和 b,而以值传递方式捕捉其他所有的变量

  <7> [&,a,this] 表示以值传递的方式捕捉 a 和 this,而以引用传递方式捕捉其他所有变量

  备注:父作用域是指包含lambda函数的语句块

  另外,需要注意的是,捕捉列表不允许变量重复传递。下面的例子就是典型的重复,会导致编译错误:

  [=, a] 这里 = 已经以值传递方式捕捉了所有的变量,那么再捕捉 a 属于重复

  [&,&this] 这里 & 已经以引用传递方式捕捉了所有变量,那么再捕捉 this 属于重复

  (2)(parameters):参数列表。与普通函数的参数列表一致。如果不需要参数传递,则可以连同括号()一起省略

  (3)mutable : mutable修饰符。默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性

  在使用该修饰符时,参数列表不可省略(即使参数为空)

  (4)->return-type : 返回类型。用追踪返回类型形式声明函数的返回类型。

  出于方便,不需要返回值的时候也可以连同符号->一起省略

  此外,在返回类型明确的情况下,也可以省略该部分,让编译器对返回类型进行推导

  (5){statement} : 函数体。内容与普通函数一样,不过除了可以使用参数之外,还可以使用所有捕获的变量

  在lambda函数的定义中,参数列表和返回类型都是可选的部分,而捕捉列表和函数体都可能为空

  那么,在极端情况下,C++11中最为简单的lambda函数只需要声明为:

  []{};

  就可以了。不过显然,这样的lambda函数不能做任何事情。

【2】lambda函数示例代码

  示例代码1:

 1 #include <iostream>
 2 using namespace std;
 3
 4 void main()
 5 {
 6     int a = 20, b = 10;
 7
 8     auto totalAB = [] (int x, int y)->int{ return x + y; };
 9     int aAddb = totalAB(a, b);
10     cout << "aAddb :" << aAddb << endl;
11
12     auto totalAB2 = [a, &b]()->int{ return a + b; };
13     int aAddb2 = totalAB2();
14     cout << "aAddb2 :" << aAddb2 << endl;
15
16     auto totalAB3 = [=]()->int{ return a + b; };
17     int aAddb3 = totalAB3();
18     cout << "aAddb3 :" << aAddb3 << endl;
19
20     []{}; // 最简lambda函数
21     [=] { return a + b; }; // 省略了参数列表与返回类型,返回类型由编译器推断为int
22     auto fun1 = [&] (int c) { b = a + c; }; // 省略了返回类型,无返回值
23     auto fun2 = [=, &b](int c)->int { return b += a + c; }; // 各部分都很完整的lambda函数
24     cout << "fun2(100) :" << fun2(100) << endl;
25 }
26 // Result:
27 /*
28 aAddb :30
29 aAddb2 :30
30 aAddb3 :30
31 fun2(100) :130
32 */

  以上代码仅供学习参考

【3】lambda函数总结

  函数的使用

Good  Good  Study,  Day  Day  Up.

时间: 2024-08-11 09:43:04

C++ lambda函数的相关文章

python笔记-lambda函数、sorted函数、map函数

1.lambda函数:又称匿名函数,示例如下: def f(x): return x**2 print f(4)  #16 g = lambda x:x**2 print g(4)  #16 2.map函数 print map(lambda x:x**2,range(10)) #[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 3.sorted函数 dict = {9:2,4:3,6:9,'a':'test','e':'fff','*':'$'} print sorted

Python编程中自定义Lambda函数的使用场景

Python 中定义函数有两种方法,一种是用常规方式 def 定义,函数要指定名字,第二种是用 lambda 定义,不需要指定名字,称为 Lambda 函数. Lambda 函数又称匿名函数,匿名函数就是没有名字的函数,函数没有名字也行?当然可以啦.有些函数如果只是临时一用,而且它的业务逻辑也很简单时,就没必要非给它取个名字不可. 好比电影里面的群众演员,往往他们的戏份很少,最多是衬托主演,跑跑龙套,他们需要名字吗?不需要,因为他们仅仅只是临时出镜,下次可能就用不着了,所以犯不着费心思给他们每个

lambda函数,常用函数,内置函数(string,zip()map()filter())的用法

lambda函数胡使用#coding:utf-8g = lambda x,y:x*y/*必须亦g=*/print g(2,3)/*print必须有*/swtich函数使用 def jia(x,y):    return x+ydef jian(x,y):    return x-ydef cheng(x,y):    return x*ydef chu(x,y):    return x/yoperator = {"+":jia,"-":jian,"*&q

Python中的lambda函数

今天在看书的时候,看到了这样的一条语句: if isinstance(value,int) or isinstance(value,float): split_function=lambda row:row[column]>=value 对其中的lambda这个函数表示很不明白,于是看了看Python文档,文档中解释如下:   lambda An anonymous inline function consisting of a single expression which is evalua

C++11新特性:Lambda函数(匿名函数)

声明:本文参考了Alex Allain的文章http://www.cprogramming.com/c++11/c++11-lambda-closures.html 加入了自己的理解,不是简单的翻译 C++11终于知道要在语言中加入匿名函数了.匿名函数在很多时候可以为编码提供便利,这在下文会提到.很多语言中的匿名函数,如C++,都是用Lambda表达式实现的.Lambda表达式又称为lambda函数.我在下文中称之为Lambda函数. 为了明白Lambda函数的用处,请务必先搞明白C++中的自动

初窥c++11:lambda函数

为什么需要lambda函数 匿名函数是许多编程语言都支持的概念,有函数体,没有函数名.1958年,lisp首先采用匿名函数,匿名函数最常用的是作为回调函数的值.正因为有这样的需求,c++引入了lambda 函数,你可以在你的源码中内联一个lambda函数,这就使得创建快速的,一次性的函数变得简单了.例如,你可以把lambda函数可在参数中传递给std::sort函数 #include <algorithm> #include <cmath> void abssort(float*

Python lambda函数

python允许定义单行的小函数,定义lambda函数的形式如下: lambda 参数:表达式lambda函数默认返回表达式的值,可接收任意个参数,包括可选参数,但是表达式只有一个. 如果你的函数非常简单,只有一个表达式,不包含命令,可以考虑lambda函数.

Python的lambda函数与排序

Python的lambda函数与排序 2010-03-02 15:02 2809人阅读 评论(0) 收藏 举报 lambdapythonlistlispclass工作 目录(?)[+] 前几天看到了一行求1000的阶乘的Python代码: print    reduce ( lambda    x , y : x * y ,    range ( 1 ,    1001 )) 一下子被python代码的精简 与紧凑所折服,故对代码进行了简单的分析. reduce与range都是Python的内置

[C++11] lambda函数

简介: [capture](parameter) mutable ->return_type {statement} [capture]:捕获列表,是lambda函数的引出符号,从上下文中捕捉变量以供函数使用. [var]:值传递捕捉变量var: [=]:值传递捕捉所有父作用域变量: [&var]:引用传递捕捉变量var: [&]:引用传递捕捉所有父作用域变量: [this]:值传递捕捉当前this指针. (parameter):参数列表.如果不需要可连同括号一起省略. mutabl

python 使用lambda函数 和 list comprehension

python 使用lambda函数 学习资源 lambda函数学习 list comprehension 多维数组初始化 lambda 函数 Python 支持一种有趣的语法,它允许你快速定义单行的最小函数.这些叫做 lambda 的函数,是从 Lisp 借用来的,可以用在任何需要函数的地方. def f(x): return x*2,用lambda函数来替换可以写成:g = lambda x: x*2`g(3)结果是6.(lambda x: x*2)(3)`也是同样的效果. 这是一个 lamb