C++lambda表達式

先來說背景:當我們需要對一些的元素進行排序的時候,可以使用std::sort來進行排序,而當需要對一些自定義類型的元素來排序的時候,要去寫一個類,或者說是需要寫一個仿函數,而如果功能要求上需要根據不同的比較去排序,那就需要寫好幾個仿函數用于去排序,因此這個是很不方便的,比如下面代碼:

struct Goods
{std::string _name; // 名字double _price; // 價格int _evaluate; // 評價Goods(const char* str, double price, int evaluate):_name(str), _price(price), _evaluate(evaluate){}
};
struct ComparePriceLess
{bool operator()(const Goods& gl, const Goods& gr){return gl._price < gr._price;}
};
struct ComparePriceGreater
{bool operator()(const Goods& gl, const Goods& gr){return gl._price > gr._price;}
};
int main()
{std::vector<Goods> v = { { "蘋果", 2.1, 5 }, { "香蕉", 3, 4 }, { "橙子", 2.2,3 }, { "菠蘿", 1.5, 4 } };std::sort(v.begin(), v.end(), ComparePriceLess());std::sort(v.begin(), v.end(), ComparePriceGreater());
}

因此,lambda表達式可以讓我們免去需要多次寫一個類的這個步驟,下面是使用lambda表達式的例子:

int main()
{std::vector<Goods> v = { {"蘋果",2.1,5},{"香蕉",3,4},{"荔枝",5,6},{"西瓜",1.1,7} };std::sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2){return g1._price < g2._price;});std::sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2){return g1._price > g2._price;});return 0;
}

lambda表達式語法:

lambda表達式書寫格式:[capture-list] (parameters) mutable -> return-type { statement}

[capture-list]:捕捉列表。該列表總是出現在lambda函數的開始位置,編譯器根據[]來判斷接下來的代碼是否為lambda函數,捕捉列表能夠捕捉上下文中的變量供lambda函數使用。

?

捕捉列表的說明:

?[var] 表示以值傳遞的方式捕捉變量var。

?[=] 表示以值傳遞的方式捕捉父作用域中所有的變量,包括this。父作用域指包含lambda函數的語句塊。

? [&var] 表示以引用傳遞的方式捕捉變量var。

?[&] 表示以引用傳遞的方式捕捉父作用域中所有的變量,包括this。

?[this] 表示捕捉當前的this。

??

說明:

1.語法上捕捉列表可由多個捕捉項組成,并以逗號分割:比如:[=, &a, &b]:以引用傳遞的方式捕捉變量a和b,值傳遞方式捕捉其他所有變量[&,a, this]:值傳遞方式捕捉變量a和this,引用方式捕捉其他變量。

2.捉列表不允許變量重復傳遞,否則就會導致編譯錯誤,比如:比如:[=, a]:=已經以值傳遞方式捕捉了所有變量,捕捉a重復。

3.在塊作用域以外的lambda函數捕捉列表必須為空。

4.lambda表達式之間不能相互賦值,即使看起來類型相同

?

(parameters):參數列表。與普通函數的參數列表一致,如果不需要參數傳遞,則可以連同()一起省略。

?

mutable:默認情況下,lambda函數總是一個const函數,mutable可以取消其常量性。使用該修飾符時,參數列表不可省略(即使參數為空)。

?

->returntype:返回值類型。用追蹤返回類型形式聲明函數的返回值類型,沒有返回值時此部分可省略。返回值類型明確情況下,也可省略,由編譯器對返回類型進行推導。

?

{statement}:函數體。在該函數體內,除了可以使用其參數外,還可以使用所有捕獲
到的變量

在lambda函數定義中,參數列表和返回值類型都是可選部分,而捕捉列表和函數體可以為空。因此C++11中最簡單的lambda函數為:[]{}; 該lambda函數不能做任何事情。

lambda的原理

底層編譯器對于lambda表達式的處理方式,完全就是按照函數對象的方式處理的,即:如果定義了一個lambda表達式,編譯器會自動生成一個類,在該類中重載了operator()。
?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/35398.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35398.shtml
英文地址,請注明出處:http://en.pswp.cn/news/35398.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于chatgpt動手實現一個ai_translator

動手實現一個ai翻譯 前言 最近在極客時間學習《AI 大模型應用開發實戰營》&#xff0c;自己一邊跟著學一邊開發了一個進階版本的 OpenAI-Translator&#xff0c;在這里簡單記錄下開發過程和心得體會&#xff0c;供有興趣的同學參考&#xff1b; ai翻譯程序 版本迭代 在學習…

VLC播放主要流程

前言 VLC 播放流程大概是先加載解封裝器,然后通過es_out控制所有的stream。然后會加載decoder。最終通過resource文件的方法交給輸出 模塊。下面簡要介紹。 正文 播放器主要分為三層。主要通過兩個接口實現了功能隔離。分別是es_out.c和decoder.c的實現了&#xff1a; //控…

算法練習-搜索 相關

文章目錄 迷宮問題 迷宮問題 定義一個二維數組 m行 * n列 &#xff0c;如 4 5 數組下所示&#xff1a; int arr[5][5] { 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, }; 它表示一個迷宮&#xff0c;1表示墻壁&#xff0c;0表示可以走的路&#xff0c;只…

Synchronized八鎖

/** * Description: 8 鎖 * 1 標準訪問&#xff0c;先打印短信還是郵件 ------sendSMS ------sendEmail 2 停 4 秒在短信方法內&#xff0c;先打印短信還是郵件 ------sendSMS ------sendEmail 3 新增普通的 hello 方法&#xff0c;是先打短信還是 hello ------getHello ------…

Idea中使用statement接口對象,顯示mysql版本號,所有庫和表名

使用statement 接口對象&#xff0c;進行以下操作&#xff1a; 顯示數據庫版本號顯示所有庫顯示所有庫中的table表 顯示數據庫版本號&#xff1a; public class StatementDemo {Testvoid showall(){try{Statement st conn.createStatement();ResultSet rs st.executeQuery(…

pytest fixture 常用參數

fixture 常用的參數 參數一&#xff1a;autouse&#xff0c;作用&#xff1a;自動運行&#xff0c;無需調用 舉例一&#xff1a;我們在類中定義一個function 范圍的fixture; 設置它自動執行autouseTrue&#xff0c;那么我們看下它執行結果 輸出&#xff1a; 說明&#xff1a;…

Leetcode-每日一題【劍指 Offer 12. 矩陣中的路徑】

題目 單詞必須按照字母順序&#xff0c;通過相鄰的單元格內的字母構成&#xff0c;其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母不允許被重復使用。 例如&#xff0c;在下面的 34 的矩陣中包含單詞 "ABCCED"&#xff08;單詞中的字母…

CUDA執行模型

一、CUDA執行模型概述 二、線程束執行 1. 線程束與線程塊 線程束是SM中基本的執行單元。 當一個線程塊的網格被啟動后&#xff0c;網格中的線程塊分布在SM中。 一旦線程塊被調度到一個SM中&#xff0c;線程塊中的線程會被進一步劃分成線程束。 一個線程束由32個連續的線程…

【Express.js】數據庫初始化

數據庫初始化 在軟件開發階段和測試階段&#xff0c;為了方便調試&#xff0c;我們通常會進行一系列的數據庫初始化操作&#xff0c;比如重置數據表&#xff0c;插入記錄等等&#xff0c;或者在部署階段進行數據初始化的操作 根據前面章節介紹過的 knex.js 和 sequelize.js&…

基于自適應曲線閾值和非局部稀疏正則化的壓縮感知圖像復原研究【自適應曲線閾值去除加性穩態白/有色高斯噪聲】(Matlab代碼實現)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;歡迎來到本博客????&#x1f4a5;&#x1f4a5; &#x1f3c6;博主優勢&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客內容盡量做到思維縝密&#xff0c;邏輯清晰&#xff0c;為了方便讀者。 ??座右銘&a…

什么是媒體代發布?媒體代發布注意事項

傳媒如春雨&#xff0c;潤物細無聲&#xff0c;大家好&#xff0c;我是51媒體網胡老師。 媒體代發布是指將新聞稿或其他宣傳內容委托給專業的媒體代理機構或公司進行發布和推廣的活動。這些機構通常擁有豐富的媒體資源、人脈和經驗&#xff0c;能夠更好地將信息傳遞給目標受眾…

C語言 指針與內存之間的關系

一、內存與字節 一個內存單元一個字節一個地址 整型 int 類型中int類型的字節數是4 且一個字節表示八個bite位 一個二進制數位有著32個bite 所以又可以表示為&#xff1a;一個字節 8個比特位 32位數的二進制數位的八分之一 例如&#xff1a; int a 10&#xff1b; 該表達式…

項目實戰 — 消息隊列(9){編寫demo程序}

消息隊列服務器核心功能就是&#xff0c;提供了虛擬主機&#xff0c;交換機&#xff0c; 隊列&#xff0c;消息等概念的管理&#xff0c;實現三種典型的消息轉發方式&#xff0c;可以實現跨主機/服務器之間的生產者消費模型。 這里&#xff0c;就編寫一個demo&#xff0c;實現…

【實戰講解】數據血緣落地實施

?在復雜的社會分工協作體系中&#xff0c;我們需要明確個人定位&#xff0c;才能更好的發揮價值&#xff0c;數據也是一樣&#xff0c;于是&#xff0c;數據血緣應運而生。 今天這篇文章會全方位的講解數據血緣&#xff0c;并且給出具體的落地實施方案。 一、數據血緣是什么…

JAVA多線程和并發基礎面試問答(翻譯)

JAVA多線程和并發基礎面試問答(翻譯) java多線程面試問題 1. 進程和線程之間有什么不同&#xff1f; 一個進程是一個獨立(self contained)的運行環境&#xff0c;它可以被看作一個程序或者一個應用。而線程是在進程中執行的一個任務。Java運行環境是一個包含了不同的類和程序…

蘇州OV泛域名RSA加密算法https

RSA加密算法是一種非對稱加密算法&#xff0c;它被廣泛應用于信息安全領域。與對稱加密算法不同&#xff0c;RSA加密算法使用了兩個密鑰&#xff0c;一個公鑰和一個私鑰。公鑰可以公開&#xff0c;任何人都可以使用它加密信息&#xff0c;但只有私鑰的持有者才能解密信息。RSA加…

php如何對接偽原創api

在了解偽原創api的各種應用形態之后&#xff0c;我們繼續探討智能寫作背后的核心技術。需要說明的是&#xff0c;智能寫作和自然語言生成、自然語言理解、知識圖譜、多模算法等各類人工智能算法都有緊密的關聯&#xff0c;在百度的智能寫作實踐中&#xff0c;常根據實際需求將多…

全球勞動力革命,Papaya Global 打破薪資界限

員工需求和勞動力結構的進一步變化&#xff0c;只會增加對更加自動化和全面的全球薪資解決方案的需求。 遠程工作潮流與全球勞動力的蓬勃發展&#xff0c;使得企業在全球范圍內&#xff0c;尋找最優秀的人才成為可能。然而&#xff0c;隨之而來的復雜薪資管理挑戰&#xff0c;也…

優雅地處理RabbitMQ中的消息丟失

目錄 一、異常處理 二、消息重試機制 三、錯誤日志記錄 四、死信隊列 五、監控與告警 優雅地處理RabbitMQ中的消息丟失對于構建可靠的消息系統至關重要。下面將介紹一些優雅處理消息丟失的方案&#xff0c;包括異常處理、重試機制、錯誤日志記錄、死信隊列和監控告警等。…

BUUCTF題目Web部分wp(持續更新)

關于SQL注入的一些通用辦法 可以訪問哪些表 如有權限&#xff0c;查詢當前用戶可以訪問的所有表 --Oracle查詢當前用戶可訪問的所有表 select owner&#xff0c; table_name from all_tables order by table_name; --MySQL查詢用戶可訪問的所有數據庫和表 select table_sche…