中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++ lambda表達式

發布時間:2020-08-10 12:23:46 來源:網絡 閱讀:612 作者:zmh009_NAME 欄目:編程語言

    C++11新標準引入lambda表達式,主要部分如下:

    [捕獲列表](參數)->type{函數體},使用尾置返回類型,其中可以忽略參數與返回類型,但要保存捕獲列表與函數體,使用調用運算符調用,可在(參數)后添加mutable限定符使值捕獲的數據可在函數體里修改。

    使用lambda表達式時,編譯器會產生未命名類的未命名對象,且有一個調用運算符成員函數,實際使用時會調用該調用運算符成員函數。該未命名類不包含默認構造函數、賦值運算符、默認析構函數,而是否包含默認的拷貝、移動構造函數與捕獲數據成員類型有關。

    [捕獲列表]

    表示外部捕獲的數據,會將外部數據通過構造函數傳入未命名類里,可使用值傳遞與引用傳遞,值傳遞:auto Lambda = [intVal](){cout << intVal << endl;}; Lambda();,默認intVal為const類型,且該調用運算符是const成員函數,不可修改intVal,如果需要修改則在(參數)后添加限定符mutable:

auto Lambda = [intVal]()mutable{cout << ++intVal << endl;}; Lambda();,此時intVal可修改,且調用運算符成員函數是非const函數。值傳遞不會改變外部數據。

    引用傳遞:auto Lambda = [&intVal](){cout << ++intVal << endl;}; Lambda();,引用傳遞是否被修改取決于intVal是否為const類型,如果被修改則會同時修改外部數據。

    可使用隱式的值、引用傳遞,其捕獲的數據可通過編譯器在函數體的推導得出:auto Lambda = [=,&intVal](){cout << (data+intVal) << endl;}; Lambda();,其中data為隱式值傳遞;auto Lambda = [&](){cout << (data-intVal) << endl; func();}; Lambda();,其中data,intVal都是隱式引用傳遞,同時調用了func函數。如果使用隱式傳遞則要求=、&要在捕獲列表的首位置,同時之后的顯式捕獲不可為隱式捕獲的傳遞方式。

    注:如果是在類內使用并調用類內數據,則可以使用[=]、[&]、[this]方式隱式或顯式捕獲this并使用類內成員,如果是類靜態成員可以直接使用而不用捕獲。

    (參數)

    接收外部參數,與普通調用類似:auto Lambda = [](int val){cout << ++val << endl;}; Lambda(1);。匿名函數是可調用對象,可作為比較函數傳入: 

// main.cpp
#include <iostream>
#include <algorithm>
using std::cout;
using std::ends;
using std::sort;
using std::string;
using std::begin;
using std::end;

int main()
{
    string arr[] = {"123","12345","1233","1233345"};
    sort(begin(arr),end(arr),[]
              (const string &s1,const string &s2)
              {
                  return s1.size() > s2.size(); // 按照字符串的大小逆序排序
              }
             );
    for (const auto &each : arr)
    {
        cout << each << ends;
    }
    return 0;
}

    ->type為尾置返回類型,可省略,如果有多個return且返回類型不一致,則需要指明返回類型:

// main.cpp
#include <iostream>
using std::cout;
using std::ends;

int main()
{
    auto Lambda = [](int choice)->char
    {
        if (choice == 0)
        {
            return 0x41; // 'A'
        }
        else
        {
            return '1';
        }
    };
    cout << Lambda(0) << ends;
    return 0;
}

    {函數體},這個應該很熟悉

    以上是對lambda表達式的介紹,如有錯誤望交流指正。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

利辛县| 策勒县| 赣榆县| 台江县| 读书| 图们市| 正安县| 黎平县| 同江市| 普陀区| 威信县| 临澧县| 锡林郭勒盟| 永年县| 蓝田县| 阿荣旗| 南溪县| 阿克苏市| 太仆寺旗| 信丰县| 贺州市| 吴旗县| 遂川县| 广汉市| 庆阳市| 宣汉县| 大足县| 班戈县| 剑河县| 阳西县| 当雄县| 郑州市| 仙居县| 灵丘县| 台北县| 云南省| 衢州市| 名山县| 伊春市| 大埔区| 二连浩特市|