首頁 >後端開發 >C++ >如何在C中使用lambda表達式和函數對象(函子)?

如何在C中使用lambda表達式和函數對象(函子)?

Robert Michael Kim
Robert Michael Kim原創
2025-03-12 16:54:15802瀏覽

如何在C中使用lambda表達式和函數對象(函子)

lambda表達式提供了一種創建匿名函數對象的簡潔方法。它們被定義為內聯,通常是在使用的上下文中。語法通常看起來像這樣:

 <code class="c  ">[capture list](parameter list) -> return type { function body };</code>
  • 捕獲列表:指定可以在lambda中訪問周圍範圍的變量。選項包括:

    • [] :什麼也沒捕獲。
    • [=] :按值捕獲周圍範圍中的所有變量。
    • [&] :通過引用捕獲周圍範圍中的所有變量。
    • [=, &var1, &var2] :除了var1var2以外,捕獲所有通過參考捕獲的數值。
    • [var1, &var2] :按值捕獲var1 ,並通過參考捕獲var2
  • 參數列表:類似於常規功能參數。
  • 返回類型:可以在->之後明確指定,也可以由編譯器隱式推導。
  • 功能主體: Lambda執行的代碼。

例子:

 <code class="c  ">#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> numbers = {1, 2, 3, 4, 5}; std::for_each(numbers.begin(), numbers.end(), [](int x){ std::cout </int></algorithm></vector></iostream></code>

函數或功能對像是超載函數調用operator() )的類。這允許將類的實例稱為函數。

例子:

 <code class="c  ">#include <iostream> #include <vector> class Doubler { public: void operator()(int x) { std::cout  numbers = {1, 2, 3, 4, 5}; Doubler doubler; std::for_each(numbers.begin(), numbers.end(), doubler); // Output: 2 4 6 8 10 std::cout </vector></iostream></code>

在C中使用lambda表達式與函子之間有什麼實際差異?

主要區別在於簡潔和範圍。對於簡單操作,Lambda表達式更加緊湊,消除了定義單獨類別的需求。它們在範圍內也隱含地定義,使其非常適合一次性操作。另一方面,函子是明確定義的類,允許更複雜的邏輯,成員變量維護狀態以及跨代碼多個部分的潛在重複使用。 Lambdas通常的能力受到限制,超出周圍範圍捕獲的狀態的能力。函子可以在整個生命週期中具有成員變量來存儲和操縱狀態。

在C中,我什麼時候應該更喜歡lambda表達方式而不是函數,反之亦然?

在以下情況時更喜歡lambda的表達

  • 您需要一個僅使用一次的簡單,簡短,匿名的功能。
  • 您需要從周圍範圍捕獲變量。
  • 簡潔是一個優先事項。

何時更喜歡函子

  • 您需要具有多種方法或內部狀態的更複雜的功能。
  • 您需要在代碼的多個部分中重複使用該功能。
  • 您需要在函數調用之間保持狀態。
  • 您需要更高級的功能,例如繼承或多態性。

在所有C場景中,我都可以互換使用lambda表達式,如果不是,為什麼不呢?

不,您不能總是互換使用lambda表達式和函子。雖然它們都表示功能對象,但它們的功能也有所不同。 Lambdas的簡潔性和內聯性表現出色,非常適合簡單,簡單的操作。但是,他們缺乏全面課程的靈活性。函子,課程,提供對狀態管理,成員功能和可重複性的更多控制,但它們引入了更多的樣板代碼。因此,選擇取決於特定任務的複雜性和要求。具有狀態操作的複雜功能更適合函子,而簡單的一次性使用操作則受益於lambda的簡潔性。

以上是如何在C中使用lambda表達式和函數對象(函子)?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn