C++11 lambda運算式基本用法__C++

來源:互聯網
上載者:User
#include <iostream>using namespace std;void func1(){    cout<<"lambda運算式,值捕獲,類似值傳遞"<<endl;    size_t v1=30;//size_t為unsigned int不帶正負號的整數    size_t v2=30;    size_t v3=30;    auto f=[v1,v2,v3]{return v1+v2+v3;};//lambda運算式中[]裡面放的是要傳遞的參數,可以放多個。    v1=2;    cout<<f()<<endl;    cout<<endl;    //因為這是類似值傳遞,所以v1在改變前就已經給了f,所以不會變。注意隱式捕獲得到的變數不能被改變,只能使用其值不能改變    //可以理解成[const v1]當然你不能這樣寫只是可以這麼認為}void func2(){    cout<<endl;    cout<<"lambda運算式,引用捕獲,類似引用傳遞"<<endl;    size_t v1=30;//size_t為unsigned int不帶正負號的整數    size_t v2=30;    size_t v3=30;    auto f=[&v1,v2,&v3]{return v1+v2+(v3++);};//lambda運算式中[]裡面放的是要傳遞的參數,可以放多個。這裡v1,v3為引用,v2為值傳遞    cout<<"引用值沒變前:"<<endl;    cout<<"v1="<<v1<<endl        <<"v2="<<v2<<endl        <<"v3="<<v3<<endl;    cout<<f()<<endl;    v1=40;    cout<<"引用值改變後:"<<endl;    cout<<"v1="<<v1<<endl        <<"v2="<<v2<<endl        <<"v3="<<v3<<endl;//之前調用了一次f所以v3會加1    cout<<f()<<endl;    cout<<endl;    //因為這是類似引用傳遞,所以v1改變後f返回的值也會對應的改變。而且在f中也引用用v3並且v3進行了自增操作,所以第二次輸出v3時的值是31}void func3(){    cout<<endl;    cout<<"lambda運算式,隱式值捕獲"<<endl;    size_t v1=30;//size_t為unsigned int不帶正負號的整數    size_t v2=20;    size_t v3=10;    auto f=[=,&v2]    {        v2=v1+v3;                };    //lambda運算式中[]裡面放的是要傳遞的參數,可以放多個。    //第一個為=,第二個為&v2,表示除了v2是引用傳遞以外,其他從外面來的參數都是值傳遞,而隱式傳遞同時只能用一種。要麼引用要麼值傳遞    //值傳遞只能被使用,不能被改變,如果企圖改變值傳遞的值編譯會報錯    cout<<"沒變前:"<<endl;    cout<<"v1="<<v1<<endl        <<"v2="<<v2<<endl        <<"v3="<<v3<<endl;    cout<<"改變後:"<<endl;    f();    cout<<"v1="<<v1<<endl        <<"v2="<<v2<<endl        <<"v3="<<v3<<endl;    cout<<endl;}void func4(){    cout<<endl;    cout<<"lambda運算式,隱式引用捕獲"<<endl;    size_t v1=30;//size_t為unsigned int不帶正負號的整數    size_t v2=20;    size_t v3=10;    auto f=[&,v2]    {        v1++;        v3=v2;    };    //lambda運算式中[]裡面放的是要傳遞的參數,可以放多個。    //第一個為&,第二個為v2,表示除了v2是值傳遞以外,其他從外面來的參數都是引用傳遞,而隱式傳遞同時只能用一種。要麼引用要麼值傳遞    cout<<"沒變前:"<<endl;    cout<<"v1="<<v1<<endl        <<"v2="<<v2<<endl        <<"v3="<<v3<<endl;    cout<<"改變後:"<<endl;    f();    cout<<"v1="<<v1<<endl        <<"v2="<<v2<<endl        <<"v3="<<v3<<endl;    cout<<endl;}void func5(){    cout<<"lambda運算式,可變的值捕獲"<<endl;    size_t v1=30;//size_t為unsigned int不帶正負號的整數    size_t v2=20;    size_t v3=10;    auto f=[v1,v2,v3]() mutable     {        v1=v2+v3;        v2=v1+v3;        v3=v1+v2;    };    //lambda運算式中[]裡面放的是要傳遞的參數,可以放多個。    cout<<"v1="<<v1<<endl        <<"v2="<<v2<<endl        <<"v3="<<v3<<endl;    cout<<endl;    //看到輸出結果是不是覺得很奇怪嗎,不是說可變嗎,結果值還是一樣。這裡的可變是指在lambda運算式中原本值傳遞的參數只能被獲得值。不能對其進行其他動作    //mutable的原因,使其可以像函數裡的變數一樣被使用,可以理解成函數中的值傳遞。函數中的值傳遞就是可以對其參數進行任何操作。}void func6(){    cout<<"lambda運算式,指定傳回型別"<<endl;    auto f=[](int i)->int      {        return i;    };    //lambda運算式中[]裡面放的是要傳遞的參數,可以放多個。    cout<<f(50)<<endl;    //要指定lambda運算式的傳回型別我們必須用->來設定    cout<<endl;   }void main(void){    func1();//值捕獲    func2();//引用捕獲    func3();//隱式值傳遞    func4();//隱式引用傳遞    func5();//可變lambda    func6();//指定傳回型別    system("pause");}


如果有什麼不對的地方請大家指出,這幾天整理的lambda運算式的基本用法


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.