C++ :lambda表達式

目錄

lambda表達式書寫格式:

lambda表達式各部分說明:

lambda的使用示范:

注意事項:?

?返回值類型可以省略,參數也可也省略:

sort內部也可以直接寫lambda表達式:?

排序時利用lambda進行排序:?

lambda的類型:

捕捉列表的使用方式 和 mutable為什么省略 ? ?

lambda的特殊使用方式:?

混合捕捉:?


lambda表達式書寫格式:

[capture-list] (parameters) mutable -> return-type { statement }

lambda表達式各部分說明:

  • [capture-list] : 捕捉列表,該列表總是出現在lambda函數的開始位置,編譯器根據[]來 判斷接下來的代碼是否為lambda函數,捕捉列表能夠捕捉上下文中的變量供lambda 函數使用。
  • (parameters):參數列表。與普通函數的參數列表一致,如果不需要參數傳遞,則可以 連同()一起省略
  • mutable:默認情況下,lambda函數總是一個const函數,mutable可以取消其常量 性。使用該修飾符時,參數列表不可省略(即使參數為空)。?
  • ->returntype:返回值類型。用追蹤返回類型形式聲明函數的返回值類型,沒有返回 值時此部分可省略。返回值類型明確情況下,也可省略,由編譯器對返回類型進行推 導。
  • {statement}:函數體。在該函數體內,除了可以使用其參數外,還可以使用所有捕獲 到的變量。

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

根據lambda的表達式,可以看出 lambda的本質是一個匿名函數,其次捕捉列表雖然可以為空,但是不能被省略,而mutable在默認的情況下可以省略,只有在特殊的情況下才進行使用

lambda的使用示范:

注意事項:?

?返回值類型可以省略,參數也可也省略:

返回值在明確的時候可以省略!因為編譯器它會自動推導!同樣參數也可以省略!前提是沒有參數!

sort內部也可以直接寫lambda表達式:?

排序時利用lambda進行排序:?

lambda的類型:

?每一個lambda表達式都是不一樣的,可以看到下圖中的lambda后面跟隨著的一串數字亂碼都是不固定的。

?其次,lambda的本質是一個仿函數,是因為lambda的底層或是說它的內部會更具lambda的內容生成對應的仿函數,不過是類似于仿函數,因為調用lambda本質上是調用operator()

捕捉列表的使用方式 和 mutable為什么省略 ? ?

如上圖所示,捕捉列表[]內部并沒有任何的參數,反而是參數列表中進行了傳址調用,這里使得lambda是變成了一個匿名函數,而如果想只捕捉變量 a 和 b 則需要將ab放入捕捉列表中,參數列表變為空即可,但是把a和b放入捕捉列表又會出現一些小問題:

?因為捕捉的變量是拷貝,而不是直接進行傳址拷貝的,而是傳值拷貝的,同時捕獲的變量是被const修飾的,也就是捕獲列表的a,b是不可修改的,所以這里就需要mutable?

?

但是還是沒有什么意義,應為把捕獲的a,b變得可以修改數值,但是捕獲的a,b和外面變量a,b不是同一個a,b,所以沒有意義,因為捕獲列表的捕獲是傳值拷貝,不是傳址拷貝,所以這樣使用mutable和這樣寫法的捕獲列表是無效的,沒有意義的。

如果想要同時修改外面的變量,可以使用&進行引用捕獲:

但是&是引用和取地址在這里會出問題,容易弄混,這下面是引用方式捕捉:

?同時也可以使用傳指針的方式進行交換來改變外面的變量

lambda的特殊使用方式:?

?[=]傳值捕捉所有,[&]傳引用捕捉所有,前者是傳值調用,捕獲所有變量的數值,后者是引用調用,捕獲所有的變量并且進行引用

混合捕捉:?


?

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

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

相關文章

STM32MP135裸機編程:使用軟件觸發硬件復位

0 參考資料 STM32MP13xx參考手冊.pdf 1 使用寄存器實現軟件復位 1.1 復位電路概述 重點關注下面標紅的路線: 通過這條路線可以清楚看到,我們可以通過設置RCC_MP_GRSTCSETR寄存器讓RPCTL(復位脈沖控制器)給NRST(硬件復…

蘋果可能與谷歌合作推AI訂閱服務;全國首個司法審判大模型在深圳上線

🦉 AI新聞 🚀 蘋果可能與谷歌合作推AI訂閱服務 摘要:蘋果宣布將與OpenAI合作推出Apple Intelligence,并有望在今年秋季與谷歌達成合作,接入Gemini。Meta的Llama因質量不佳被拒。蘋果計劃推出訂閱模式的智能功能服務&…

Oracle PL / SQL 存儲過程

PL / SQL存儲過程不返回值。他們執行他們的指示并返回。您不能在賦值語句(如函數)的右側使用存儲過程。 創建存儲過程 以下代碼是一個非常簡單的存儲過程示例。 它基于SYS.DBMS_LOCK包的程序sleep(數量)。 此存儲過程將停止執行…

在 C++的跨平臺開發中,如何處理不同操作系統和編譯器之間的細微差異,以確保程序能夠穩定且高效地運行?

在 C 的跨平臺開發中,處理不同操作系統和編譯器之間的細微差異是非常重要的。以下是一些處理差異的技巧: 使用條件編譯:使用預處理指令,根據不同的操作系統和編譯器來編寫不同的代碼。 #if defined(_WIN32)// Windows 特定代碼 …

kafka的工作原理與常見問題

定義 kafka是一個分布式的基于發布/訂閱模式的消息隊列(message queue),主要應用于大數據的實時處理領域 消息隊列工作原理 kafka的組成結構 kafka的基礎架構主要有broker、生產者、消費者組構成,還包括zookeeper. 生產者負責發送…

算法09 日期相關模擬算法【C++實現】

這是《C算法寶典》算法篇的第09節文章啦~ 如果你之前沒有太多C基礎,請點擊👉專欄:C語法入門,如果你C語法基礎已經爐火純青,則可以進階算法👉專欄:算法知識和數據結構👉專欄&#xff…

計算斜率,判斷斜率

#include <stdio.h> #include <stdlib.h> #include <math.h> #include <stdbool.h>// 定義常量 #define LOW_COOK_WINDOW_SIZE 20 // 滑動窗口大小&#xff0c;10個樣本點&#xff08;10秒&#xff09; #define LOW_COOK_SLOPE…

Java代碼生成器(開源版本)

一、在線地址 Java在線代碼生成器&#xff1a;在線訪問 二、頁面截圖 三、核心功能 支持Mybatis、MybatisPlus、Jpa代碼生成使用 antlr4 解析SQL語句&#xff0c;保證了SQL解析的成功率支持自定義包名、作者名信息支持自定義方法名、接口地址支持自定義選擇是否生成某個方法…

16-Python Pandas聚合函數

Python Pandas聚合函數 窗口函數可以與聚合函數一起使用&#xff0c;聚合函數指的是對一組數據求總和、最大值、最小值以及平均值的操作。 應用聚合函數 首先讓我們創建一個 DataFrame 對象&#xff0c;然后對聚合函數進行應用。 import pandas as pd import numpy as np d…

SQL中的子查詢和CTE(with ....as..)

第一次看到with as 這種類似于python中讀文件的寫法還是挺疑惑的&#xff0c;其實它是CTE&#xff0c;功能和子查詢很類似但又有不同點&#xff0c;在實際應用場景中具有著獨特作用。 子查詢 子查詢是在主查詢中的嵌套查詢&#xff0c;可以出現在SELECT、FROM、WHERE等子句中…

ai除安卓手機版APP軟件一鍵操作自動渲染去擦消稀缺資源下載

安卓手機版&#xff1a;點擊下載 蘋果手機版&#xff1a;點擊下載 電腦版&#xff08;支持Mac和Windows&#xff09;&#xff1a;點擊下載 一款全新的AI除安卓手機版APP&#xff0c;一鍵操作&#xff0c;輕松實現自動渲染和去擦消效果&#xff0c;稀缺資源下載 1、一鍵操作&…

數學建模(1):期末大亂燉

1 概述&#xff01;&#xff01; 1.1 原型和模型 原型&#xff1a;客觀存在的研究對象稱為原型&#xff0c;也稱為“系統”、“過程”。 機械系統、電力系統、化學反應過程、生產銷售過程等都是原型&#xff1b; 研究原型的結構和原理&#xff0c; 從而進行優化、預測、評價…

Perl編程藝術:深入探索Tie機制的魔力

&#x1f31f; Perl編程藝術&#xff1a;深入探索Tie機制的魔力 在Perl的世界里&#xff0c;tie功能是一種極其強大的特性&#xff0c;它允許程序員將變量綁定到一個對象上&#xff0c;從而改變這個變量的默認行為。這種機制為變量提供了一種代理訪問方式&#xff0c;使得變量…

Jedis、Lettuce、RedisTemplate連接中間件

jedis就像jdbc一樣&#xff0c;用于兩個端直接的連接。 1.創建Spring項目 這里不過多贅述... 2.導入連接工具jedis 在pom文件中導入jedis的依賴。 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version&…

結合數據索引結構看SQL的真實執行過程

引言 關于數據庫設計與優化的前幾篇文章中&#xff0c;我們提到了數據庫設計優化應該遵守的指導原則、數據庫底層的索引組織結構、數據庫的核心功能組件以及SQL的解析、編譯等。這些其實都是在為SQL的優化、執行的理解打基礎。 今天這篇文章&#xff0c;我們以MySQL中InnoDB存…

vim卡死

有些時候使用vim的時候莫名其妙的會卡死&#xff0c;導致輸入不了內容。查了一下資料發現&#xff0c;其實并不是vim卡死&#xff0c;而是在使用vim的工程中帶入了許多Windows上的使用習慣&#xff0c;比如“Ctrl-s”保存等&#xff0c;這可能會與Linux平臺的有些快捷鍵沖突。c…

Oracle PL / SQL 表 table

關系數據庫允許您在數據庫管理系統&#xff08;DBMS&#xff09;中存儲多個表。 您可以使用計算機上的查詢語言來操作表中的數據。 當前的查詢語言是結構化查詢語言&#xff08;SQL&#xff09;。 SQL是一組無關的命令&#xff0c;用于操作關系數據庫管理系統&#xff08;RD…

CleanMyMacX2024免費且強大的mac電腦系統優化工具

如果你的Mac電腦出現了存儲空間不足、運行緩慢、電池電量消耗過快等問題&#xff0c;那么CleanMyMacX這款軟件或許能為你提供解決方案。作為一款強大的系統優化工具&#xff0c;它能夠幫助用戶清理垃圾文件、優化內存和電池使用&#xff0c;從而提升Mac的性能表現&#xff0c;讓…

后端之路第三站(Mybatis)——XML文件操作sql

一、XML映射文件是啥 前面我們學過了在Mapper接口用注解的方式來操作sql語句 那么XML映射文件就另一種操作sql語句的方法 為什么還要有這么個玩意&#xff1f; 我簡單說就是&#xff1a;如果有的sql特別復雜的話&#xff0c;比如需要【動態sql】的話&#xff0c;就得用到XM…

【Android面試八股文】Fragment的add和replace的區別,分別對Fragment的生命周期有什么影響?

文章目錄 一、Fragment的add和replace的區別 ,分別對Fragment的生命周期有什么影響?1.1 `add` 方法1.2 `replace` 方法1.3 應用場景1.4 Fragment事務操作提交流程1.5 replace操作的本質是不是就是remove操作和add操作的組合?1.6 示例代碼:將一個已經存在的 `FragmentA` 替換…