动态

详情 返回 返回

lambda表達式 - 动态 详情

C++ 中的 Lambda 表達式是一種簡潔的語法結構,允許在代碼中直接定義和使用匿名函數。Lambda 表達式增強了代碼的靈活性和可讀性,特別是在處理算法、函數對象、事件處理、回調函數等場景下尤為有用。其一般格式如下:

[capture_list](parameter_list) -> return_type { function_body }

各部分詳細説明:

  1. 捕獲列表(Capture List)

    • [] 是捕獲列表開始的標誌,可以為空或者包含以下幾種捕獲方式:

      • = (值捕獲):捕獲外部作用域中的變量副本,對這些變量的修改不會影響原變量。

        int x = 10;
        auto l = [=]() { return x * 2; }; // 捕獲x的值,即使之後x改變,l仍返回20
      • & (引用捕獲):捕獲外部作用域中變量的引用,對這些變量的修改會影響原變量。

        int y = 20;
        auto m = [&y]() { ++y; return y; }; // 捕獲y的引用,調用m會增加y的值
      • this 關鍵字:捕獲當前對象的指針,用於在成員函數內部訪問類的成員。
      • 不指定任何符號時,默認情況下是非靜態局部變量的引用捕獲,同時也會捕獲所有通過值捕獲的外部變量。

      複合捕獲也是可能的,例如 [=,&z] 意味着除了 z 通過引用捕獲外,其餘變量都通過值捕獲。

  2. 參數列表(Parameter List)

    • 這部分和常規函數參數列表類似,用於定義Lambda接受的輸入參數。

      auto add = [](int a, int b) { return a + b; };
  3. 返回類型(Return Type)

    • 使用 -> 後跟返回類型表示Lambda的返回值類型,不過在某些情況下可以省略,編譯器可以根據函數體內的返回語句自動推斷返回類型。

      // 顯式指定返回類型
      auto multiply = [](int x, int y) -> int { return x * y; };
      
      // 自動推斷返回類型
      auto divide = [](double x, double y) { return x / y; }; // 返回double
  4. 函數體(Function Body)

    • 包含Lambda所執行的操作,即實際的函數邏輯。

      auto print = []() { std::cout << "Hello, Lambda!" << std::endl; };

綜合示例:

#include <iostream>
#include <algorithm>

int main() {
    int numbers[]{1, 2, 3, 4, 5};

    // 使用lambda表達式作為std::count_if的謂詞
    int count_divisible_by_3 = std::count_if(numbers, numbers+5, [](int n) { return n % 3 == 0; });
    std::cout << "Numbers divisible by 3: " << count_divisible_by_3 << std::endl;

    // 引用捕獲的例子
    int total = 0;
    auto accumulate_values = [&](int value) -> void { 
        total += value; 
    };

    for (int i : numbers) {
        accumulate_values(i);
    }

    std::cout << "Total of the numbers: " << total << std::endl;

    return 0;
}

在這個示例中:

  • 第一個lambda用於計算數組中能被3整除的元素個數,它沒有捕獲任何外部變量,只有一個參數列表,並隱式推斷出返回類型為bool。
  • 第二個lambda是一個無返回值的函數對象,捕獲了外部變量total並通過引用,使得每次調用時都能更新total的值。

Add a new 评论

Some HTML is okay.