由python為入口回顧C++的lambda

来源:http://www.cnblogs.com/euewrqe/archive/2016/07/31/5724353.html
-Advertisement-
Play Games

lambda是一種匿名函數,python lambda可以使簡單的函數簡潔的表達,,C++的lambda使類似嵌套函數的功能得以實現 python的lambda VC++14的lambda lambda是vc++獨有的,在vc++11以後,擴展這個功能主要是為了使代碼書寫簡潔,gcc沒有這個功能 直 ...


lambda是一種匿名函數,python  lambda可以使簡單的函數簡潔的表達,,C++的lambda使類似嵌套函數的功能得以實現

python的lambda

lambda [arg1[,arg2,arg3....argN]]:expression

#用def定義的函數
def foo():
    return 'hello world'
print(foo())
#用lambda定義的函數
print(lambda:'hello world')
#因為沒有給它保存到變數,用完後就失效了,提高了性能
foo_1=lambda:'hello world'
print(foo_1())
#加參數
foo_3=lambda a,b=10:a+b
print(foo_3(20,10))
foo_4=lambda *args:args
print(foo_4(1,2,3,4))
#lambda表達式必須在一行,python一行寫不下可以用\換行
foo_5=lambda **kwargs:\
kwargs
print(foo_5(a=1,b=2,c=3))
#還可以變數間賦值
foo_2=foo_1
print(type(foo_2))

VC++14的lambda

lambda是vc++獨有的,在vc++11以後,擴展這個功能主要是為了使代碼書寫簡潔,gcc沒有這個功能

 

直接使用,對於一些不重覆使用的函數,使用完了自動丟棄

int result = [](int a) {return a*a; }(10);
cout << result << endl;

如果要反覆利用,可以使用變數來存儲

auto pow_2 = [](int a) {return a*a; };
cout << pow_2(10) << endl;

lambda的類型

cout << typeid(pow_2).name() << endl;      //類型是class <lambda_a10bdd2a3443eccb15c2cfee0f251b1b>

 

lambda結構

  1. Capture 子句(在 C++ 規範中也稱為 lambda 引導。)

  2. 參數列表(可選)。 (也稱為 lambda 聲明符)

  3. 可變規範(可選)。

  4. 異常規範(可選)。

  5. 尾隨返回類型(可選)。

  6. “lambda 體”

1,lambda引導

位置可傳入外部參數,可以通過傳值或傳址方式直接傳入外部數據

[&] 通過引用傳入外部所有變數(地址不會變),[=]通過數值傳入外部所有變數,[i]指定變數傳值,[&i]指定變數傳址

int i = 10;
int front = (int)&i;            //front是i的地址
cout << i << "-->" << front << endl;    //輸出這次地址
cout << &front << endl;            //查看front的地址
auto func_1 = [i,&front] {                //傳入i(傳值)和front(傳址)
    int back = (int)&i; 
    cout << i << "-->" << back <<            //輸出這次地址
        "\nback-front=" << abs(back - front) << endl;
    cout << &front << endl;            //再次查看front地址
};
func_1();
//得出
/*
10-->7601564     第一次的i
0073FD90            第一次的front
10-->7601536     第二次的i
back-front=28
0073FD90           第二次的front
*/

 

 

struct S { void f(int i); };

void S::f(int i) {
    [&, i]{};    // 在所有都為引用的時候,可以指定一個不為引用
    [&, &i]{};   // 當預設全部引用的時候,不能在指定i為引用
    [=, this]{}; // ERROR: this when = is the default
    [i, i]{};    // 變數不能重覆
}

 

 

2,參數列表,auto使用泛型值,或者指定類型

char* a = "aaa";
char* b = "bbb";
[](auto& a, auto& b) {
    auto temp = a;
    a = b;
    b = temp;
}(a,b);
cout << a <<" "<< b << endl;

 

3,可變規範

一般情況下,通過傳值獲得的變數不能修改

int n = 0;
[&, n]() {++n; }();
//提示錯誤:“n”: 無法在非可變 lambda 中修改通過複製捕獲

 

mutable規範允許lambda中修改n的值,由於n是通過值捕獲,在lambda結束後,n的值不會變

int m = 0;
int n = 0;
[&, n](int a)mutable {m = ++n + a; }(4);
cout << m << " " << n << endl;
5
0

 

4,異常規範

5,返回值由char*變成string

char a[10] = "aaa";
char* b = "bbb";
auto merge_str=[](char* a, char* b)->string{
    char* result = strcat(a, b);
    return result;
};
cout << merge_str(a, b)<<"-->"<<typeid(merge_str(a, b)).name() << endl;

 

6,lambda體,可放入任意代碼塊

 

lambda表達式賦值方法:

//1,可賦值給auto變數
auto f1 = [](int x, int y) {return x + y; };
cout << f1(1,2) << endl;
//2,可賦值給函數對象
function<int(int, int)>f2 = [](int x, int y) {return x + y; };
cout << f2(3,4) << endl;
3
7

 

find_if()  參數一:迭代器頭部  參數二:迭代器尾部  參數三,返回一個指針  返回值:找到的元素的指針

vector<char*>v1 = { "aaa","bbb","ccc","ddd","eee" };
auto result=
find_if(v1.begin(), v1.end(), [](char* n) { return n=="ccc"; });
cout << *result << endl;
ccc

 

lambda嵌套

int result = [](int x) {return [&x](int y) {return (x + y); }(10); }(20);
cout << result << endl;
30

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 /// <summary> 2 /// 九宮格演算法 3 /// </summary> 4 public void NineTable() 5 { 6 //創建一個三階方陣 7 int[,] arr = new int[3, 3]; 8 //第3行的行下標 9 int a = 2; 10 //第2 ...
  • 說明:本文是個人翻譯文章,由於個人水平有限,有不對的地方請大家幫忙更正。 原文: "dotnet run" 翻譯: "dotnet run" 名稱 dotnet run 沒有任何明確的編譯或啟動命令運行“就地”(即運行命令的目錄)源代碼。 概要 `dotnet run [ framework] [ ...
  • 發現很少有集中討論C#可變性限制的中文博文(要麼就是一大段文字中夾雜很多凌亂的部分),所以寫發篇博文,集中討論,這些限制基本是基於安全考慮,亦或者根本難以實現而產生的。 註:本文不再解釋什麼是可變性,以及本文所討論的問題都基於.NET 4至.NET 4.5。所有地方我都力求簡潔。 好了,廢話不說了, ...
  • 隨著互聯網項目用戶訪問量不斷上升,單點web伺服器是無法滿足大型高併發高負載的業務處理的,為了給web伺服器做負載均衡方案,打算採用Nginx搭建負載均衡伺服器,把用戶請求分配到N個伺服器來緩解伺服器壓力。 Nginx簡介: Nginx (“engine x”) 是一個高性能的 HTTP 和 反向代 ...
  • 前段時間,一直有練習ASP.NET MVC與Web API交互,接下來,Insus.NET再做一些相關的練習,Web API與文件操作,如POST文件至Web API,更新或是刪除等。不管怎樣,先在資料庫創建一張表,用來存儲上傳的文件。本實例中是把文件存儲過資料庫的。 CREATE TABLE Ap ...
  • 1.continue,break,ruturn eg:1-100的和 結果為:5050 換為break,查看結果 結果為:10 結論一:break:跳出整個迴圈體 換為continue看一下結果又是多少? 結果為:5045,(除5之外都執行) 結論二:continue跳過當前條件的迴圈 return ...
  • 目錄索引 【無私分享:ASP.NET CORE 項目實戰】目錄索引 簡介 本章我們來介紹下Asp.net Core 使用 CodeFirst 創建資料庫和表,通過 控制台 和 dotnet ef 兩種方式 修改EF上下文對象,添加測試類 我修改了一下名字,Domains 改為了 wkmvc.Data ...
  • 字元串操作大概是電腦程式中最常見的操作了,Java中表示字元串的類是String,它有哪些方法?內部是如何實現的?如何處理各種不同的編碼?不可變性意味著什麼?字元串常量到底是什麼?hashCode是如何實現的?... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...