最近DeepSeek比較火,就用它來溫習一下lambda表達式
問:幫我寫一個C++的lambda表達式例子
DS: 當然!下面是一個簡單的C++ lambda表達式的例子:
#include <iostream> #include <vector> #include <algorithm> int main() { // 創建一個整數向量 std::vector<int> numbers = {1, 2, 3, 4, 5}; // 使用lambda表達式打印每個元素 std::for_each(numbers.begin(), numbers.end(), [](int n) { std::cout << n << " "; }); std::cout << std::endl; // 使用lambda表達式計算元素的平方并存儲到另一個向量中 std::vector<int> squares; std::transform(numbers.begin(), numbers.end(), std::back_inserter(squares), [](int n) { return n * n; }); // 打印平方后的結果 std::for_each(squares.begin(), squares.end(), [](int n) { std::cout << n << " "; }); std::cout << std::endl; return 0; }
DS: 代碼解釋:
-
第一個lambda表達式:
[](int n) { std::cout << n << " "; }這個lambda表達式接受一個整數
n作為參數,并打印它。它被傳遞給std::for_each,用于遍歷numbers向量并打印每個元素。 -
第二個lambda表達式:
[](int n) { return n * n; }這個lambda表達式接受一個整數
n作為參數,并返回它的平方。它被傳遞給std::transform,用于將numbers向量中的每個元素平方,并將結果存儲到squares向量中。
輸出:
1 2 3 4 5 1 4 9 16 25
這個例子展示了如何使用lambda表達式來簡化代碼,尤其是在需要傳遞簡單函數對象的情況下。
問:有沒有更復雜的lambda表達式例子
DS: 當然!下面是一個更復雜的C++ lambda表達式例子,展示了如何捕獲外部變量、使用mutable關鍵字、以及返回一個lambda表達式。
#include <iostream> #include <functional> int main() { int x = 10; int y = 5; // 一個復雜的lambda表達式,捕獲x和y,并返回一個lambda表達式 auto complexLambda = [x, &y](int z) mutable -> std::function<int(int)> { // 修改捕獲的x(因為是mutable) x += z; // 修改捕獲的y(因為是引用) y += z; // 返回一個新的lambda表達式 return [x, y](int w) mutable { return x + y + w; }; }; // 調用complexLambda,傳入z = 3 auto innerLambda = complexLambda(3); // 調用innerLambda,傳入w = 2 int result = innerLambda(2); // 輸出結果 std::cout << "Result: " << result << std::endl; // 輸出: Result: 20 std::cout << "x after complexLambda: " << x << std::endl; // 輸出: x after complexLambda: 10 std::cout << "y after complexLambda: " << y << std::endl; // 輸出: y after complexLambda: 8 return 0; }
DS: 代碼解析:
-
捕獲外部變量:
-
[x, &y]:x是按值捕獲,y是按引用捕獲。 -
按值捕獲的變量在lambda內部是只讀的,除非使用
mutable關鍵字。 -
按引用捕獲的變量可以直接修改。
-
-
mutable關鍵字:-
使用
mutable后,按值捕獲的變量(如x)可以在lambda內部修改。 -
注意:這種修改不會影響外部的原始變量。
-
-
返回一個lambda表達式:
-
complexLambda返回一個新的lambda表達式,這個新的lambda表達式捕獲了x和y的值。 -
返回的lambda表達式接受一個參數
w,并返回x + y + w。
-
-
調用過程:
-
complexLambda(3):傳入z = 3,修改x和y的值,并返回一個新的lambda表達式。 -
innerLambda(2):調用返回的lambda表達式,傳入w = 2,計算x + y + w。
-
-
輸出結果:
-
Result: 20:x(修改后為13) +y(修改后為8) +w(2) = 20。 -
外部的
x仍然是10,因為它是按值捕獲的。 -
外部的
y被修改為8,因為它是按引用捕獲的。
-
更復雜的場景:
如果你想要更復雜的lambda表達式,可以結合以下特性:
-
泛型lambda(C++14及以上):
auto genericLambda = [](auto a, auto b) { return a + b; }; std::cout << genericLambda(3, 4.5) << std::endl; // 輸出: 7.5 -
遞歸lambda:
使用std::function來實現遞歸調用:std::function<int(int)> factorial = [&factorial](int n) -> int { return (n <= 1) ? 1 : n * factorial(n - 1); }; std::cout << factorial(5) << std::endl; // 輸出: 12
浙公網安備 33010602011771號