C++ 中的 Lambda 表達式是一種匿名函數,可以方便地創建并傳遞函數對象。這是 C++11 引入的一項重要功能,可以大大提高代碼的可讀性和簡潔性。
以下是一個深入講解 C++ 使用 Lambda 表達式的例子,包括基本語法、捕獲列表、函數調用、以及與 STL 的結合使用等。
首先,我們來看一個最簡單的 lambda 表達式:
[](){/* do nothing */};
這個 lambda 表達式定義了一個空函數,沒有參數,也沒有返回值。你可以將其看作是一個沒有實體的具名函數。
你還可以定義帶有參數的 lambda 表達式:
[](int a, float b){return a + b;};
這個函數接收兩個參數,一個是 int 類型的 a,另一個是 float 類型的 b。它的返回值是 a 和 b 的和。
你也可以定義帶有默認參數的 lambda 表達式:
[](int a, float b = 0.0f){return a + b;};
這個函數和上一個函數功能基本相同,只是 b 參數的默認值是 0.0f。
你還可以在 lambda 表達式中捕獲外部變量的值:
int a = 10;float b = 20.0f;auto add = [&a, &b]() { return a + b; }; // 使用引用捕獲外部變量std::cout << add() << std::endl; // 輸出 30
在這個例子中,&a 和 &b 是通過引用來捕獲 a 和 b 的值的。這意味著 lambda 表達式可以修改捕獲的變量的值。如果你只想在 lambda 表達式中使用外部變量的值,而不修改它們的值,你應該使用值捕獲而不是引用捕獲。例如:
int a = 10;float b = 20.0f;auto add = [a, b]() { return a + b; }; // 使用值捕獲外部變量std::cout << add() << std::endl; // 輸出 30
在這個例子中,雖然 a 和 b 的值被傳遞給了 lambda 表達式,但是 lambda 表達式并不能修改它們的值。
你可以將 lambda 表達式作為一個函數參數傳遞給其他函數。例如,你可以使用一個 lambda 表達式來作為 std::sort 函數的比較函數:
std::vector<int> v = {5, 3, 1, 4, 2};std::sort(v.begin(), v.end(), [](int a, int b) {return a < b;}); // 使用 lambda 表達式作為比較函數std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " ")); std::cout << std::endl; // 輸出 1 2 3 4 5
在這個例子中,lambda 表達式 [](int a, int b) {return a < b;} 被傳遞給了 std::sort 函數,用于比較 v 中的元素。這意味著你可以用 lambda 表達式來實現自定義的算法和數據結構。
下面我們再來看一個比較復雜但很有用的例子:使用 lambda 表達式和 STL 來查找一個 vector 中第一個出現的不重復的元素:
#include <iostream>#include <vector>#include <algorithm>#include <unordered_set>int main() { std::vector<int> v = {1, 2, 3, 2, 4, 3, 5, 6, 4}; auto it = std::find_if(v.begin(), v.end(), [&](int a) { return std::find(std::begin(un), std::end(un), a) == std::end(un); }); }
在這個例子中,我們使用了一個較為復雜的 lambda 表達式來作為 std::find_if 函數的比較函數。這個 lambda 表達式接收一個參數 a,然后使用一個名為 un 的 std::unordered_set 來查找 a 是否第一次出現。這個例子展示了如何使用 lambda 表達式和 STL 來解決一個復雜的問題。
本文鏈接:http://www.tebozhan.com/showinfo-26-16511-0.htmlC++使用Lambda表達式實例講解
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 聊一聊 Python 的換行以及轉義