C++Primer 第10章lambda表达式
C++Primer 第10章lambda表達式
泛型編程
咱們繼續高歌猛進,下面我給大家繼續講關于算法的故事。
 我們知道標準庫容器中定義的算法大多數獨立在算法之外,通常這些算法是通用的。它們可以處理不同類型的容器中的元素。是不是聽起來非常的神奇?不同的容器可以利用相同的算法,這些功勞都可以歸因于他們擁有相同的迭代器接口,雖然不同的容器其數據結構不同。但是其迭代器經過包裝,給用戶在使用時, 可以使用相同的操作方法,來對不同的容器進行操作,那么算法就可以利用迭代器來間接地訪問容器內的元素,從而達到處理元素的目的。因此,大多數的算法并不依賴于容器本身,不過某些容器對于某些算法有特定的優化,雖然公用的算法可以實現其目的,但是其效率并不如容器自己定義的算法。
 那么這些算法又有哪些功能呢?本書可以將算法歸為以下幾類:
 只讀算法,例如 find,accumulate,equal 等算法。
 寫容器元素的算法,例如 fill,copy,
 replace_copy等算法。
 重排元素的算法,sort,unique等算法。
 刪除元素的算法,free,erase等算法。
 這些算法的具體操作,我在這里就不一一贅述了。因為我也記不住,哈哈。
lambda表達式
當把書看到這里的時候 我不未免覺得這個東西有點的奇怪,但是當我仔細閱讀之后,我突然發現C++11相比于C++98改變是革命性的,這個表達式就清楚地體現了c++11的強大以及靈活之處。
 其實我在之前學習qt的時候,在快速定義信號槽時,我有遇見過該表達式,當時我以為這樣的語法是qt內自帶的,與C++沒有關系。中括號內傳入的引用以及等于號,這樣的操作,真的非常的絕妙,回想我之前編寫的一些程序,用到該表達式,真的會讓代碼更加的清爽且易于實現。那么言歸正傳,什么是lambda表達式呢?這種表達式其實是一種函數的變體。都有返回類型,函數體以及參數列表,但是與普通的函數不同。lambda表達式沒有名稱,并且在之前的中括號內可以傳入更多的參數,并且更加靈活以及清爽,以下是lambda表達式的寫法:
首先說中括號
我們先從這個中括號開始說起,中括號學名捕獲列表,在中括號內可以寫入一些變量或者引用,這樣可以使lambda表達式函數體之中,使用到變量的引用與拷貝,值得注意的是,傳入的引用以及變量,是之前程序中必須要初始化定義的,否則會使該處出錯。
 當然 中括號內也可以隱式的傳入一些數據,中括號內寫 = 時,編譯器將運行至該處,已經定義的元素,統一的拷貝入lambda表達式中,在表達式的函數體中使用這些元素時,使用的是該元素的拷貝,點值得注意。
 當中括號中寫 & 時,編譯器將運行至此處,已經定義的元素的地址傳入lambda表達式中,表達式函數題當中改變元素的時候,表達式之外元素的內容也會發生改變。
 本書中建議,中括號內傳入的變量需要盡量簡單,因為當我們捕獲一個指針或者迭代器時,在表達式中,一定需要關注,傳入時也要有預期的值。一般來說,我們應該盡量減少捕獲的數據量,來避免潛在的捕獲導致的問題,并且應該盡可能不捕獲指針或者引用。
說說小括號
小括號中與普通的函數體相同,都是參數列表,這里的使用方法與普通的函數相同。不做更多的描述。
說說大括號
便是lambda表達式的函數體,lambda表達式的函數體,與普通的函數使用方法一致,不過我們發現,表達式的寫法并沒有定義返回類型,這樣表達式內需要返回出類型,則就需要一定的考究,當我們不寫return時,lambda表達式默認返回void類型,當返回的表達式是變量時,則該表達式返回的類型與該變量相同,類似于auto的使用方法。但是當函數體中返回的類型模棱兩可時,表達式就會出現錯誤,例如 if else 兩個不同的塊之間,定義了相同的return,但是lambda表達式會報錯,這時就需要表達式小括號之后,寫 -> 之后跟類型名,來顯示的指出return類型。
 lambda表達式,也可以當做謂詞使用在容器的算法當中,lambda表達式的出現給容積的算法增加了更多的靈活性,讓用戶更加容易的自定義算法的實現方法,從而降低用戶的編寫難度。
總結
以上是生活随笔為你收集整理的C++Primer 第10章lambda表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: Hangfire Pro 2022-08
 - 下一篇: #if...#endif是C++中的条件