C++11 -----一切从lambda说起

Lambda表达式

看了孟岩大大的一篇blog(http://blog.csdn.net/myan/article/details/5877305),偶决定先学一些主线内容:

①lambda表达式

②function/bind

③右值引用

本篇记录lambda表达式的应用:

Why Lambda:

Lambda表达式其实偶以前也接触过,只是一直用VS2005很少使用。某个大大说:不学好lambda表达式,别想看懂STL,BOOST,ACE源代码。偶不知道是真是假,除了STL小的连BOOST都没有使用过,ACE除了大学的时候蛋疼的配置过一次环境,然后敲入书中的第一个例子输出Log,然后就没有然后了。

在C/C++中没有函数嵌套定义,而lambda表达式正好弥补了这个缺陷。对与一些小的函数,通过lambda表达式来实现,增加了代码的紧密性,方便理解和阅读(执行效率会不会高一些呢?)。

What Lambda:

[=,&ref,val](int a,int b)mutable->double{语句;}(1,2);

①=:lambda可以访问外面的变量,但不可写

②&ref:引用外部变量,可读可写可返回(引用传递)

③val:表示值传递,可读不可写

④(int a ,int b)这没啥解释的

⑤mutable:表示非引用的值也可读可写,但不能返回

⑥->double决定块内部的返回值类型

⑦{语句;}函数块

⑧(1,2):取出函数指针指向地址的内容

这些来自维基百科:

[] // 沒有定義任何變數。使用未定義變數會導致錯誤。

[x, &y] // x以傳值方式傳入(預設),y以傳參考方式傳入。

[&] // 任何被使用到的外部變數皆隱式地以參考方式加以引用。

[=] // 任何被使用到的外部變數皆隱式地以傳值方式加以引用。

[&, x] // x顯示地以傳值方式加以引用。其餘變數以參考方式加以引用。

[=, &z] // z顯示地以參考方式加以引用。其餘變數以傳值方式加以引用。

How Lambda:

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
//lambda基础
void lambda_one();
//sort中lambda实例
void lambda_two();
//lambda函数递归
void lambda_three();

int main()
{
 lambda_one();
 lambda_two();
 lambda_three();
 getchar();
 return 0;
}

void lambda_one()
{
    cout<<endl <<"------------没有函数参数的lambda---------------------"<<endl;
    auto fun = [](){};
    auto fun1 = [](){cout <<"fun1"<<endl;};
    fun1();

    cout<<endl <<"------------for_each中使用简单的lambda----------------"<<endl;
    std::vector<int>  v(3,5);
    for_each(v.begin(),v.end(),[](int num){ cout << num << "\t";});

    cout<<endl <<"------------设置lambda的返回值类型--------------------"<<endl;
    cout <<[](double a, double b){return a + b;}(1.4,2.5)<<endl;
    cout <<[](double a, double b)->int{return a + b;}(1.4,2.5)<<endl;

    cout<<endl <<"------------lambda中的传值----------------------------"<<endl;
    int x = 10;
    int y = 100;
    [=](double a, double b)mutable->int
    {
        cout <<"lambda:"<<(x = 100) << "\t" <<(y = 10)<<endl;
        return a + b;
    }(1.4,2.5);
    cout<<"main:" << x <<"\t"<< y <<endl;

    cout<<endl <<"------------lambda中的传引用--------------------------"<<endl;
    [&x,&y](double a, double b)mutable->int
    {
        cout <<"lambda:"<<(x = 100) << "\t" <<(y = 10)<<endl;
        return a + b;
    }(1.4,2.5);
    cout<<"main:" << x <<"\t"<< y <<endl;

    cout<<endl <<"------------lambda中的传引用和引用传递------------------"<<endl;
    //等号必须写在前面,或者也可以[x,&y].
    //=表示,除了&y,其他所有的外部变量都可以按照值传递进行访问。
    [=,&y](double a, double b)mutable->int
    {
        cout <<"lambda:"<<(x = 100) << "\t" <<(y = 10)<<endl;
        return a + b;
    }(1.4,2.5);
    cout<<"main:" << x <<"\t"<< y <<endl;
}

void lambda_two()
{
    //1.sort排序
    cout <<endl<<"------------sort排序中使用lambda------------------------"<<endl;
    int  a[8] = {6,8,3,4,9,2,7,1};
    sort(begin(a),end(a),[](const int &a ,const int &b)->bool{return a < b;});
    for_each(begin(a),end(a),[](const int &num){cout << num << "\t";});

    cout <<endl<<"---------------------------------------------------------"<<endl;

}

void lambda_three()
{
//2. (lambda递归)3个数返回最大的两个数的和
    cout <<endl<<"------------lambda递归-----------------------------------"<<endl;
    function<int(int,int,int)> f = [&f](int a,int b,int c)->int
    {
        if (a<= b && a <= c)
        {
        return b + c;
        }
        return f(b,c,a);
    };
    cout << f(4,5,6)<<endl;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-08 06:49:07

C++11 -----一切从lambda说起的相关文章

c++ 11学习笔记--Lambda 表达式(对比测试Lambda ,bind,Function Object)

所有c++ coder都应该为这个语法感到高兴,说的直白一点,Lambda 表达式就是函数对象的语法糖. 还是直接看对比栗子吧,抄袭的是msdn的官网 该示例使用 for_each 函数调用中嵌入的 lambda 向控制台打印 vector 对象中的每个元素是偶数还是奇数. 使用lambda #include <algorithm> #include <iostream> #include <vector> using namespace std; int main()

IOS中的Block与C++11中的lambda

ios中的block 可以说是一种函数指针,但更确切的讲,其实际上其应该算是object-c对C++11中lambda的支持或者说是一个语言上的变体,其实际内容是一样的,C++的lambda我已经有简介过,现在说下ios中的block Block的实际行为和Function很像,最大的差别是在可以存取同一个Scope的变量值.Block实体形式如下: ^(传入参数列){行为主体}; Block实体开头是“^”,接着是由小括号所包起来的参数列(比如 int a, int b, int c),ret

C++11新特性——lambda表达式

C++11的一大亮点就是引入了Lambda表达式.利用Lambda表达式,可以方便的定义和创建匿名函数.对于C++这门语言来说来说,"Lambda表达式"或"匿名函数"这些概念听起来好像很深奥,但很多高级语言在很早以前就已经提供了Lambda表达式的功能,如C#,Python等.今天,我们就来简单介绍一下C++中Lambda表达式的简单使用. 声明Lambda表达式 Lambda表达式完整的声明格式如下: [capture list] (params list) m

C++11中的Lambda表达式

本文地址:http://www.cnblogs.com/archimedes/p/c11-lambda.html,转载请注明源地址. “Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数.Lambda表达式可以表示闭包(注意和数学传统意义上的不同). ISO C++ 11 标准的一大亮点是引入Lambda表达式.基本语法如

C++11新特性 lambda表达式

C++11 添加了了一个名为lambda表达式的功能,可以用于添加匿名函数 语法: [capture_block](parameter) mutable exception_specification ->return_type{body} e.g 一个点击时间的例子 auto btnTest = Button::create(); btnTest -> addTouchEventListener([=](Ref * sender, Widget::TouchEventType type){

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

写过c#之后,觉得c#里的lambda表达式和delegate配合使用,这样的机制用起来非常爽.c++11也有了lambda表达式,形式上有细小的差异.形式如下: c#:(input parameters) => {statement;} c++:[capture list](parameter list) -> return type {statement;} c++lambda表达式共分为4各部分.其中parameter list 和 return type 是可以在特定情况下省略的. 一

C++11 Lambda表达汇总总结

C++ 11中的Lambda表达式用于定义并创建匿名的函数对象,以简化编程工作.Lambda的语法形式如下:               [函数对象参数] (操作符重载函数参数) mutable或exception声明 ->返回值类型 {函数体}       可以看到,Lambda主要分为五个部分:[函数对象参数].(操作符重载函数参数).mutable或exception声明.->返回值类型.{函数体}.下面分别进行介绍.       一.[函数对象参数],标识一个Lambda的开始,这部分