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函数(匿名函数)

声明:本文参考了Alex Allain的文章http://www.cprogramming.com/c++11/c++11-lambda-closures.html 加入了自己的理解,不是简单的翻译...

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

声明:本文参考了Alex Allain的文章http://www.cprogramming.com/c++11/c++11-lambda-closures.html 加入了自己的理解,不是简单的...

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

http://www.fast818.com/n308.ashx 声明:本文参考了Alex Allain的文章http://www.cprogramming.com/c++11/c++11-...
  • wywty
  • wywty
  • 2013-11-06 09:51
  • 553

C++11学习之匿名函数lambda表达式

声明:本文参考了Alex Allain的文章http://www.cprogramming.com/c++11/c++11-lambda-closures.html 加入了自己的理解,不是简单的翻译...

(C++11)Lambda表达式(匿名函数)和为什么使用Lanbda表达式

名称Lanbda来自landba caculus(λ演算)--一种定义和应用函数的数学系统。这个系统能让您使用匿名函数--即无需给函数命名。在C++11中,对于接受函数指针或函数符的的函数,可使用匿名...

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

转载自:http://blog.csdn.net/richerg85/article/details/51457712 这篇文章是根据维基百科整理来的,原文请看:http://en.wikipe...

C++11特性(02)匿名函数

C++11特性:匿名函数 匿名函数 每当我们使用C++创建一个函数的时候,都必须定义然后再使用。然后在有些情况下,我们不一定需要创建函数,然后再将函数的地址传入变量中。在C++11之前,C...

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

这篇文章是根据维基百科整理来的,原文请看:http://en.wikipedia.org/wiki/Anonymous_function#C.2B.2B   C++11提供了对匿名函数的支持,称为La...

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

转载:http://www.cnblogs.com/pzhfei/archive/2013/01/14/lambda_expression.html  C++11提供了对匿名函数的支持,称为Lambd...
  • bine_
  • bine_
  • 2015-07-27 17:21
  • 300

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

这篇文章是根据维基百科整理来的,原文请看:http://en.wikipedia.org/wiki/Anonymous_function#C.2B.2B   C++11提供了对匿名函数的支持,称为L...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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