c++11——lambda表达式

lambda表达式

函数式编程的一个语法,有如下优点: 
(1)声明式编程风格:就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或者函数对象。以更直接的方式写程序,好的可读性和可维护性。 
(2)简洁:不需要额外再写一个函数或者函数对象,避免了代码膨胀和功能分散。 
(3)在需要的时间和地点实现功能闭包,使程序更灵活。

lambda表达式基本概念和用法

lambda表达式定义了一个匿名函数,并且可以捕获一定范围的变量。lambda表达式的语法如下: 
[capture] (params) opt -> ret {body;} 
其中,capture为捕获列表;params是参数表;opt为函数选项;ret为返回值类型;body是函数体。捕获列表是将lambda外部的一些变量引入lambda内部,可以为值类型或引用类型。

    auto f = [] (int a) -> int {return a + 1;};
    std::cout << f(1) << std::endl;

或者省略返回值类型(c++11可以进行类型推导),直接写成

    auto f = [](int a){return a+1;};
    std::cout << f(1) << std::endl;
捕获列表

lambda表达式可以通过捕获列表捕获一定范围内的变量:

[] 不捕获任何变量 
[&] 捕获外部作用域中的所有变量,并作为引用在函数体内使用(按引用捕获) 
[=] 捕获外部作用域内的所有变量,并作为副本在函数体内使用(按值捕获) 
[=, &foo] 按值捕获外部作用域中的所有变量,并按引用捕获foo变量 
[bar] 按值捕获bar变量,同时不捕获其他变量 
[this] 捕获当前类中的this指针,让lambda表达式拥有和当前类成员函数同样的访问权限。如果已经使用了=或者&,就默认添加此项。捕获this的目的是可以在lambda中使用当前类的成员函数和成员变量。

    int a = 0, b = 1;
    auto f1 = []{return a;} ;//错误,没有捕获外部变量
    auto f2 = [&]{return a++;};//捕获外部变量的引用,并且可以实现将a++
    auto f3 = [=]{return a;};
    auto f4 = [=]{return a++;};//错误,a是一个副本,并且为const类型,无法修改
    auto f5 = [a, &b]{return a + (b++);}//可以,按值捕获a,并且按引用捕获b

需要注意,默认情况下,lambda表达式无法修改通过复制方式捕获的外部变量。如果希望修改这些外部变量,可以通过引用方式进行捕获,或者通过显式指明lambda表达式为mutable类型:

    int a = 0;
    auto f1 = [=]{return a++;};//错误
    auto f2 = [=]()mutable{return a++;} //需要注意,mutable修饰的lambda即使没有参数,也要书写参数列表
    int main(){
    int a = 1;
    auto f = [=]{return a+1; };
    cout << f() << endl; //输出2
    cout << "a = " << a << endl; //a = 1
    auto f1 = [=]()mutable{return a++; };
    cout << "a = " << a << endl; //a = 1
    cout << f() << endl; //输出2 ????
    cout << "a = " << a << endl; //a = 1
    return 0;
    }

以及需要注意lambda的延迟调用

  1. int a = 0;
  2. auto f = [=]{return a;};
  3. a += 1;
  4. std::cout << f() << std::endl; //输出的a为之前的a

lambda表达式按值捕获外部的变量,在捕获的一瞬间,这些值就被复制到f中。

lambda表达式和闭包

在c++11中,lambda为闭包类型,是一个特殊的、匿名的非union的类类型。可以认为lambda是一个带有operator()的类,即仿函数。因此可以使用std::function和std::bind来存储和操作lambda表达式。

    std::function<int(int)> f1 = [] (int a){return a;};
    std::function<int(void)> f2 = std::bind([](int a){return a;}, 123);

对于没有捕获任何变量的lambda表达式,还可以被转换成一个普通的函数指针:

    using func_t = int(*)(int);
    func_t f = [](int a){return a;};
    f(123);

可以认为lambda是一个带有operator()的类,即仿函数。按照c++的标准,lambda表达式的operator()默认是const的,因此在按值捕获的时候不能修改外部变量的值;而使用mutable可以取消 operator()的const。

就地声明和使用lambda表达式

int count = count_if(coll.begin(), coll.end(), [](int x){return x > 5 && x < 10;});

+

时间: 2024-08-05 11:52:42

c++11——lambda表达式的相关文章

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 表达式解析

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

C++11 Lambda 表达式

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

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表达式(19篇C++11文章)

C++11引入了lambda表达式,使得程序员可以定义匿名函数,该函数是一次性执行的,既方便了编程,又能防止别人的访问. Lambda表达式的语法通过下图来介绍: 这里假设我们定义了一个如上图的lambda表达式.现在来介绍途中标有编号的各个部分是什么意思. Lambda表达式的引入标志,在‘[]’里面可以填入‘=’或‘&’表示该lambda表达式“捕获”(lambda表达式在一定的scope可以访问的数据)的数据时以什么方式捕获的,‘&’表示一引用的方式:‘=’表明以值传递的方式捕获,除

C++11 lambda表达式学习

lambda表达式是函数式编程的基础.咱对于函数式编程也没有足够的理解,因此这里不敢胡言乱语,有兴趣的可以自己查找相关资料看下.这里只是介绍C++11中的lambda表达式自己的认识.这里有参考文档http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2927.pdf 给出两个例子,可以看出lambda表达式的写法 [](int x, int y) { return x + y; } [](int x, int y) -> int {

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表达式