码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-07-26 00:31:40      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:

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;
}

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

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

标签:

原文地址:http://blog.csdn.net/supersonico/article/details/47061901

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!