新聞中心
?Lambda 是 C++ 中的匿名函數(shù)(即沒有函數(shù)名的函數(shù)),可以在定義和使用時內(nèi)聯(lián)。它們提供了一種方便的方式,將小的代碼塊作為參數(shù)傳遞給其他函數(shù),或者在不需要創(chuàng)建命名函數(shù)的情況下定義一個函數(shù)。

目前成都創(chuàng)新互聯(lián)已為千余家的企業(yè)提供了網(wǎng)站建設、域名、雅安服務器托管、綿陽服務器托管、企業(yè)網(wǎng)站設計、克山網(wǎng)站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
?Lambda 在 C++ 中提供了一種靈活而簡潔的方式來編寫類似函數(shù)的對象,并在現(xiàn)代 C++ 編程中被廣泛使用。
Lambda 的定義使用以下語法:
[ capture list ] ( argument list ) -> return type { function body }
捕獲列表(capture list)用于指定 lambda 中可訪問的來自外部作用域的變量。變量可以通過值捕獲、引用捕獲或使用 this 捕獲。
- 參數(shù)列表(argument list)指定將遞給 lambda 的參數(shù)。
- 返回類型(return type)指定 lambda 將返回的值的類型。如果未指定,則編譯器將嘗試推斷其類型。
- 函數(shù)體(function body)指定 lambda 被調(diào)用時將執(zhí)行的代碼。
以下是在C++中使用 lambda 的幾種不同方式。
1、函數(shù)回調(diào)
函數(shù)回調(diào)是將一個函數(shù)作為參數(shù)傳遞給另一個函數(shù),并在接收函數(shù)稍后的時間調(diào)用該函數(shù)。您可以將 lambda 作為函數(shù)參數(shù)傳遞,其中它將在發(fā)生某個事件時執(zhí)行。
示例:
#include
#include
#include
int main() {
std::vectornumbers = {1, 2, 3, 4, 5};
// Lambda 表達式,用于查找兩個數(shù)字的和
auto sum = [](int a, int b) { return a + b; };
int result = std::accumulate(numbers.begin(), numbers.end(), 0, sum);
std::cout << "Sum of elements in the vector: " << result << std::endl;
return 0;
}
在這個例子中,sum 變量是一個Lambda表達式,它接受兩個參數(shù) a 和 b,并返回它們的總和。std::accumulate 函數(shù)接受數(shù)字向量、結果的初始值和 sum 函數(shù)(Lambda 表達式)。該函數(shù)計算向量中所有元素的總和并返回結果,該結果被打印在屏幕上。
另一個例子:
#include
#include
#include
int main()
{
std::vectorvec = { 1, 2, 3, 4, 5 };
int sum = 0;
std::for_each(vec.begin(), vec.end(), [&sum](int x) { sum += x; });
std::cout << "The sum is: " << sum << std::endl;
return 0;
}
在這種情況下,lambda 表達式 [&sum](int x) { sum += x; } 被傳遞作為要應用于每個元素的函數(shù)。lambda 通過引用 & 捕獲變量 sum,以便可以在 lambda 主體中進行修改。
兩個例子都達到了相同的結果,但第二個例子使用了 std::for_each 算法和 lambda 表達式,這是在 C++ 中更現(xiàn)代、更簡潔的技術。
2、默認捕獲
當一個 lambda 表達式被聲明時沒有任何顯式的捕獲,其默認行為是通過引用捕獲周圍作用域中的變量。這被稱為默認捕獲。
例子:
#include
int main() {
int x = 42;
auto f = [ ]() { std::cout << x << std::endl; };
f();
return 0;
}
#include
int main()
{
auto square = [](int x) { return x * x; };
std::cout << "The square of 5 is: " << square(5) << std::endl;
return 0;
}
在第二個例子中,定義了一個 lambda 表達式并將其存儲在名為 square 的變量中。這個 lambda 表達式接受一個 int 類型的參數(shù) x,并返回 x * x 的值,即參數(shù)的平方。
在主函數(shù)中,這個 lambda 表達式被用作函數(shù)對象。通過傳遞一個值為 5 的參數(shù)來調(diào)用它,并使用 cout 流顯示結果。
3、按值捕獲
這是 lambda 表達式的最簡單形式,其中你通過值傳遞變量給函數(shù)。當一個變量被按值捕獲時,它的當前值被存儲在閉包中,而當周圍作用域中的變量發(fā)生改變時,它的值不會被更新。這可以通過將變量包含在方括號 [ ] 中來實現(xiàn)。
例子:
#include
int main() {
int x = 42;
auto f = [x]() { std::cout << x << std::endl; };
f();
return 0;
}
#include
int main() {
int x = 42;
auto f = [x](int y) { std::cout << x+y << std::endl;};
f(1);
return 0;
}
4、按引用捕獲
你可以通過使用 & 符號將變量傳遞給 lambda 表達式來按引用捕獲變量。當一個變量被按引用捕獲時,它的當前值被存儲在閉包中,并且在周圍作用域中變量發(fā)生變化時被更新。這是通過在方括號[ ]中在變量前加上取地址運算符 & 來實現(xiàn)的。
例子:
#include
int main() {
int x = 42;
auto f = [&x]() { std::cout << x << std::endl; };
f();
return 0;
}
#include
int main() {
int x = 10;
auto add_one = [&x]() { ++x; };
add_one();
std::cout << x << "\n";
return 0;
}
#include
int main() {
int x = 42;
auto f = [&x]() { std::cout << x << std::endl; };
f();
return 0;
}
5、可變Lambda表達式
默認情況下,由 lambda 表達式捕獲的變量是常量,不能在 lambda 表達式體內(nèi)修改。如果你想要在 lambda 表達式中修改捕獲的變量,你可以將 lambda 表達式設為可變??勺僱ambda允許捕獲的變量被修改。這是通過在方括號 [ ] 中包含可變關鍵字來實現(xiàn)的。
例子:
#include
int main() {
int x = 42;
auto f = [x]() mutable { std::cout << ++x << std::endl; };
f();
return 0;
}
lambda 表達式類似于普通函數(shù),但它們有一些關鍵的區(qū)別。例如,lambda 表達式的類型沒有被顯式指定,但可以由編譯器推斷出來。此外,lambda 表達式可以從周圍的作用域中捕獲變量,這使得它們非常適用于創(chuàng)建閉包和在 C++ 中使用函數(shù)式編程概念。
與傳統(tǒng)函數(shù)相比,lambda 表達式具有一些性能優(yōu)勢:
- 內(nèi)聯(lián)函數(shù):編譯器會自動將 lambda 表達式內(nèi)聯(lián),這意味著它們的代碼直接插入到調(diào)用函數(shù)中。這可以減少函數(shù)調(diào)用的開銷并提高性能。
- 避免命名函數(shù)的開銷:lambda 表達式?jīng)]有名稱,因此它們不必被聲明和存儲在符號表中,這可以減少開銷并提高性能。
- 改善高速緩存局部性:lambda 表達式可以在同一個函數(shù)中定義和使用,這意味著lambda使用的代碼和數(shù)據(jù)將存儲在與調(diào)用代碼相同的高速緩存行中。這可以改善高速緩存局部性并降低高速緩存失效的成本。
- 減小代碼大?。簂ambda 表達式通常比命名函數(shù)小,并且它們不需要外部函數(shù)調(diào)用,這可以減小編譯代碼的大小并提高性能。
- 增加靈活性:lambda 表達式可以用來將函數(shù)作為參數(shù)傳遞給其他函數(shù),這提供了更大的靈活性,可以改善性能,減少重復代碼的需求。
- 提高可讀性:lambda 表達式可以通過以緊湊而自包含的方式封裝復雜的邏輯來使代碼更易于閱讀。這可以通過使代碼更易于理解和維護來提高性能。
總之,與傳統(tǒng)函數(shù)相比,lambdas 可以通過減少開銷、提高緩存位置、減少代碼大小、提高靈活性和提高可讀性來提高性能。
網(wǎng)頁名稱:釋放C++中Lambda表達式的強大威力
網(wǎng)頁網(wǎng)址:http://m.jiaoqi3.com/article/coesdph.html


咨詢
建站咨詢
