C++11新特性:Lambda函数(匿名函数) 一段代码即可理解

原创 2016年08月29日 10:03:01

C++11新特性:Lambda函数(匿名函数) 一段代码即可理解



基本lambda语法
基本形式如下:
[capture](parameters)->return-type {body}

[]叫做捕获说明符,表示一个lambda表达式的开始。接下来是参数列表,即这个匿名的lambda函数的参数,->return-type表示返回类型,如果没有返回类型,则可以省略这部分。返回类型的表示法,这涉及到c++11的另一特性:自动类型推导,最后就是函数体部分了。匿名函数与普通函数在结构上都是一样,即有传入值,有函数体,唯一就缺函数名而已。

我们可以这样输出"hello,world"

// 定义一个匿名函数,然后用指针指向此函数

auto func = [] () { cout << "hello,world"; };
// 调用函数

func();


关于[] 捕获说明符:

(其实就是如何调用匿名函数所在的函数中的变量)

  • [] 不截取任何变量

  • [&} 截取外部作用域中所有变量,并作为引用在函数体中使用

  • [=] 截取外部作用域中所有变量,并拷贝一份在函数体中使用

  • [=, &param]   截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对param变量使用引用

  • [param]   截取param变量并且拷贝一份在函数体重使用,同时不截取其他变量

  • [this]            截取当前类中的this指针。如果已经使用了&或者=就默认添加此选项。



运行下述代码,即可速度掌握Lambda函数


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

#include <iostream>  

#include <typeinfo>  

using namespace std;

 

int main(void)

{

// 将创建的匿名函数赋值给sum  

auto sum = [](int x, int y) -> int {return x + y; };

 

// typeid用于返回指针或引用所指对象的实际类型,typeid是操作符,不是函数

// 输出:class <lambda_c2f1f973a39f2b265512c>

std::cout << typeid(sum).name() << std::endl;

 

int x = 10, y = 20;

auto result = sum(x, y);

 

// 输出: result:30

std::cout << "result : " << result << std::endl;

 

// 只是声明了一个lambda函数,但未调用  

[] {

std::cout << "Done1" << std::endl;

};

 

// 声明并调用一个lambda函数  

// 输出: Done2

[] {

std::cout << "Done2" << std::endl;

}();

 

int a = 1, b = 10;

//    无法通过编译  

//    [] {  

//        return a + b; // 错误:‘a’未被捕获      错误:‘b’未被捕获  

//    };  

 

// [=] 通过捕捉,获得上下文的数据,所以可以使用变量a,b,但无法修改a,b  

[=] {

return a + b;

};

 

// 输出:b = 10

std::cout << "b = " << b << std::endl;

 

// [&] 捕捉上下文,并且可以修改a,b  

[&](int c) {

b = a + c;

}(50);

 

// 输出:b = 51

std::cout << "b = " << b << std::endl;

 

//    [&a, b] (int c) {   // a可以在函数体中被修改,而b不能  

//        b = a + c;  

//    }(1000);  

 

auto b2 = [a, &b](int c) -> int { // a只读, b读写  

b = a + c;

return a + c;

}(1000);

 

// 输出: b1 = 1001 b2 = 1001

std::cout << "b = " << b << "  b2 = " << b2 << std::endl;

 

int n = getchar();

return 0;

}

 

运行结果

 




版权声明:更多文件,请访问 qzher.com 致力于良心IT培训,深圳QQ群:326023167

C++11中的匿名函数指针(lambda函数,lambda表达式)

这篇文章是根据维基百科整理来的,原文请看:http://en.wikipedia.org/wiki/Anonymous_function#C.2B.2B   C++11提供了对匿名函数的支持,称...
  • richerg85
  • richerg85
  • 2016年05月19日 22:35
  • 3107

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

lambdac++string编译器functionpointers 目录(?)[-] 基本的Lambda函数Lambda函数的用处Lambda函数中的变量截取Lambda函数和S...
  • huasonl88
  • huasonl88
  • 2013年08月17日 17:20
  • 453

Java8新特性——Lambda表达式(一)

1. 预备知识在了解Lambda表达式之前首先需要了解以下预备知识。1.1 如何成为一名高级码农?如果老板让你写一个用于毁灭地球的函数,而你写了一个毁灭行星的函数,若要毁灭地球只需将毁灭地球的过程传递...
  • u010425776
  • u010425776
  • 2016年08月27日 11:49
  • 3996

内置函数与lambda匿名函数

内置函数 all(iteralble) 如果可迭代对象内的所有元素的bool值为真,那么返回真,如果这个可迭代对象是空,也返回真。 all([1,2,3,4]) # return True all(...
  • Ayhan_huang
  • Ayhan_huang
  • 2017年06月20日 16:12
  • 276

Python中lambda匿名函数

参考:http://www.cnblogs.com/coderzh/archive/2010/04/30/python-cookbook-lambda.html lambda函数也叫匿名函数,即...
  • tanzhangwen
  • tanzhangwen
  • 2014年10月25日 12:43
  • 1361

C++11 Lambda函数(匿名函数)

C++11引入了lambda表达式,使得程序员可以定义匿名函数,该函数是一次性执行的,既方便了编程,又能防止别人的访问。 Lambda表达式的语法通过下图来介绍: La...
  • hemmingway
  • hemmingway
  • 2014年06月04日 08:37
  • 2011

C++11 Lambda函数(匿名函数)

1.匿名函数介绍 匿名函数是一个神奇的函数,为写代码带来很多方便 如下: #include using namespace std; int main() {     auto func...
  • oqqNAME
  • oqqNAME
  • 2014年04月07日 21:46
  • 508

深入理解C++11:C++11新特性解析与应用

2.11模板函数的默认模板参数1、C++98中仅模板类支持默认参数,模板函数不支持默认参数,但C++11中模板类和模板函数均支持默认参数 2、模板类的默认参数,对C++98和C++11中,需遵循“从...
  • yagerfgcs
  • yagerfgcs
  • 2017年03月22日 13:57
  • 780

函数、闭包及匿名函数(Lambda)

函数 闭包 匿名函数函数函数是绑定了值,或用其它表达式替换变量时可被求值或应用(apply)的计算行为的抽象。函数是一种具名或匿名的操作,其代码直到调用时才执行。在函数定义中,可能有也可能没有引用外部...
  • yuanguangyu1221
  • yuanguangyu1221
  • 2017年05月07日 07:15
  • 227

C++11:Lambda函数(匿名函数)

http://blog.csdn.net/srzhz/article/details/7934652#t0
  • kongvictor
  • kongvictor
  • 2014年08月03日 09:55
  • 222
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++11新特性:Lambda函数(匿名函数) 一段代码即可理解
举报原因:
原因补充:

(最多只允许输入30个字)