C++11 lambda表达式(19篇C++11文章)

C++11引入了lambda表达式,使得程序员可以定义匿名函数,该函数是一次性执行的,既方便了编程,又能防止别人的访问。

Lambda表达式的语法通过下图来介绍:

这里假设我们定义了一个如上图的lambda表达式。现在来介绍途中标有编号的各个部分是什么意思。

  1. Lambda表达式的引入标志,在‘[]’里面可以填入‘=’或‘&’表示该lambda表达式“捕获”(lambda表达式在一定的scope可以访问的数据)的数据时以什么方式捕获的,‘&’表示一引用的方式;‘=’表明以值传递的方式捕获,除非专门指出。
  2. Lambda表达式的参数列表
  3. Mutable 标识
  4. 异常标识
  5. 返回值
  6. “函数”体,也就是lambda表达式需要进行的实际操作

将上图的代码片段补充完整:

int x = 10;

int y = 3;

int z ;

z = [=]()mutable throw() -> int { int n = x + y; x = y ; y = n; return n;}();

cout<<z<<endl;

cout<<"x:"<<x<<"\t"<<"y:"<<y<<endl;

运行结果为:

13

x: 10  y: 3

因为是以值传递的方式访问x,y所以x,y的值并没有发生改变

现在我们队lambda表达式的基本语法已经有一些了解,下面来举几个例子。

首先这个例子说明如何向lambda表达式里面传递参数:

#include <iostream>

using namespace std;

int main()

{

int n = [] (int x, int y) { return x + y; }(5, 4);

cout << n << endl;

}

运行结果为:9

通过这个例子我们可以看出,通过“函数体”后面的‘()’传入参数。

接下来这个例子可以看出,可以像调用函数一样使用lambda表达式,但是感觉这种方式和普通函数的定义与调用就差不多了,这里只是学习使用方式而已。

#include <iostream>

using namespace std;

int main()

{

auto f = [] (int x, int y) { return x + y; };

cout << f(21, 12) << endl;

}

运行结果为:33

Lambda表达式与STL算法一起使用,自己写测试代码的时候经常用到排序、输出数组什么的,通过下面列举的几个算法也比较方便:

#include <iostream>

#include <algorithm>

#include <ctime>

using namespace std;

int main()

{

int a[10] = {0};

srand(time(NULL));

generate(a,a+10,[]()->int { return rand() % 100; });

cout<<"before sort: "<<endl;

for_each(a, a+10, [&](int i){ cout<< i <<" "; });

cout<<endl;

cout<<"After sort"<<endl;

sort(a,a+10);

for_each(a, a+10, [&](int i){ cout<< i <<" "; });

return 0;

}

Lambda表达式的嵌套:

#include <iostream>

int main()

{

using namespace std;

int m = [](int x)

{ return [](int y) { return y * 2; }(x) + 3; }(5);

cout << m << endl;

}

运行结果:13

以上代码在VC10和VC11上都能顺利编译通过。感觉lambda表达式还是比较有意思的语法,也是我接触的第一个VC11扩展。

http://www.cnblogs.com/zhuyp1015/archive/2012/04/08/2438176.html

http://www.cnblogs.com/zhuyp1015/category/370450.html

时间: 2024-10-17 12:37:39

C++11 lambda表达式(19篇C++11文章)的相关文章

C++11 lambda 表达式解析

C++11 新增了很多特性,lambda 表达式是其中之一,如果你想了解的 C++11 完整特性,建议去这里,这里,这里,还有这里看看.本文作为 5 月的最后一篇博客,将介绍 C++11 的 lambda 表达式. 很多语言都提供了 lambda 表达式,如 Python,Java 8.lambda 表达式可以方便地构造匿名函数,如果你的代码里面存在大量的小函数,而这些函数一般只被调用一次,那么不妨将他们重构成 lambda 表达式. C++11 的 lambda 表达式规范如下: [ capt

C++11 Lambda表达式简单解析

C++11 新增了很多特性,lambda 表达式是其中之一,如果你想了解的 C++11 完整特性, 建议去http://www.open-std.org/看看新标准! 很多语言都提供了 lambda 表达式,如 Python,Java 8 lambda 表达式可以方便地构造匿名函数,如果你的代码里面存在大量的小函数,而这些函数一般只被调用一次,那么不妨将他们重构成 lambda 表达式. C++11 的 lambda 表达式规范如下: [ capture ] ( params ) mutable

Python Special Syntax 11: lambda表达式

lambdTesting=lambda x: x*3 print(lambdTesting(5)) 输出 15 像C#一样传递lambda表达式: def abc(t,a): return t(a) print(abc(lambdTesting,15)) 输出:45 Python Special Syntax 11: lambda表达式,布布扣,bubuko.com

C++11 Lambda 表达式

1. 匿名函数 匿名函数是一些拥有函数体,但没有函数名的函数.Lambda是一种与匿名函数相关的编程技术,但需要说明的是Lambda表达式得到的不是一个匿名函数,而是一个函数对象.MSDN:Lambda隐式定义函数对象类并构造该类类型的函数对象. 2. Lambda语法 C++11 Lambda 表达式

C++11 lambda表达式在for_each和transform算法下的使用

以前,在lambda表达式没有进入标准的时候,对容器的遍历等涉及到使用函数指针的情况,一般人会懒得使用std::for_each,或std::transform,也许只是一个短短的几句话,却要单独写个函数,或函数对象,写的代码反而不如自己用for循环来的快. 但是,C++11引入了lambda表达式后,一切都变的简单了! 1.lambda表达式 lambda表达式是一个匿名函数,用它可以非常方便的表示一个函数对象,先简单说一下lambda表达式,下面这张图表示了C++11中lambda表达式的写

C++ 11 Lambda表达式、auto、function、bind、final、override

接触了cocos2dx 3.0,就必须得看C++ 11了.有分享过帖子:[转帖]漫话C++0x(四) —- function, bind和lambda.其实最后的Lambda没太怎么看懂. 看不懂没关系,会用就行.可惜是连用都要思考半天.其实,查找根源是定义没有搞明白. 以后买东西,用之前,先看说明书才是必要的. ---------------------------------开始正文粘贴----------------------------------------- 一.Lambda表达式

C++11 lambda 表达式作用在传统C回调函数上

//--std=c++11 #include <functional> #include <cstdio> typedef bool (*IS_X_NUM)(int); void show_x_num(int * array, int len, IS_X_NUM is_x_num) {     for(int i = 0; i < len; i++) {         if(is_x_num(array[i])) {             printf("%d 

c++11 lambda表达式

c++11新增的lambda表达式特性. lambda用来表示只调用一次的小函数[=]表示取值 [&]表示取引用()表示函数的形参{}函数体,函数体前的类型为返回值类型 1 PH::runOnMainThread([=](){ 2 PH::runOnMainThread([=]() 3 { 4 // UI Scene 5 director->replaceScene(PH::LoadingScreen::create(useHighRes)); 6 }); 7 });

c++11——lambda表达式

lambda表达式 函数式编程的一个语法,有如下优点: (1)声明式编程风格:就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或者函数对象.以更直接的方式写程序,好的可读性和可维护性. (2)简洁:不需要额外再写一个函数或者函数对象,避免了代码膨胀和功能分散. (3)在需要的时间和地点实现功能闭包,使程序更灵活. lambda表达式基本概念和用法 lambda表达式定义了一个匿名函数,并且可以捕获一定范围的变量.lambda表达式的语法如下: [capture] (params) opt