lambda表達式提供了一種創建匿名函數對象的簡潔方法。它們被定義為內聯,通常是在使用的上下文中。語法通常看起來像這樣:
<code class="c ">[capture list](parameter list) -> return type { function body };</code>
捕獲列表:指定可以在lambda中訪問周圍範圍的變量。選項包括:
[]
:什麼也沒捕獲。[=]
:按值捕獲周圍範圍中的所有變量。[&]
:通過引用捕獲周圍範圍中的所有變量。[=, &var1, &var2]
:除了var1
和var2
以外,捕獲所有通過參考捕獲的數值。[var1, &var2]
:按值捕獲var1
,並通過參考捕獲var2
。->
之後明確指定,也可以由編譯器隱式推導。例子:
<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>
主要區別在於簡潔和範圍。對於簡單操作,Lambda表達式更加緊湊,消除了定義單獨類別的需求。它們在範圍內也隱含地定義,使其非常適合一次性操作。另一方面,函子是明確定義的類,允許更複雜的邏輯,成員變量維護狀態以及跨代碼多個部分的潛在重複使用。 Lambdas通常的能力受到限制,超出周圍範圍捕獲的狀態的能力。函子可以在整個生命週期中具有成員變量來存儲和操縱狀態。
在以下情況時更喜歡lambda的表達
何時更喜歡函子:
不,您不能總是互換使用lambda表達式和函子。雖然它們都表示功能對象,但它們的功能也有所不同。 Lambdas的簡潔性和內聯性表現出色,非常適合簡單,簡單的操作。但是,他們缺乏全面課程的靈活性。函子,課程,提供對狀態管理,成員功能和可重複性的更多控制,但它們引入了更多的樣板代碼。因此,選擇取決於特定任務的複雜性和要求。具有狀態操作的複雜功能更適合函子,而簡單的一次性使用操作則受益於lambda的簡潔性。
以上是如何在C中使用lambda表達式和函數對象(函子)?的詳細內容。更多資訊請關注PHP中文網其他相關文章!