C 中的Lambda表示式與仿函式簡單介紹

2021-10-24 17:38:27 字數 2693 閱讀 9836

c++中的lambda表示式是c++11新引入的內容,從結論上來說lambda表示式並不是必要的,但是在很多情況下可以簡化我們的**,了解一下還是很有用處的。

基本語法

簡單來說,lambda函式也就是乙個函式,它的語法定義如下:

[capture]

(parameters)

mutable

->

return

-type

1.[capture]:捕捉列表。捕捉列表總是出現在lambda函式的開始處。實際上,是lambda引出符。編譯器根據該引出符判斷接下來的**是否是lambda函式。捕捉列表能夠捕捉上下文中的變數以供lambda函式使用;

2.(parameters):引數列表。與普通函式的引數列表一致。如果不需要引數傳遞,則可以連同括號「()」一起省略;

3.mutable:mutable修飾符。預設情況下,lambda函式總是乙個const函式,mutable可以取消其常量性。在使用該修飾符時,引數列表不可省略(即使引數為空);

4.->return-type:返回型別。用追蹤返回型別形式宣告函式的返回型別。我們可以在不需要返回值的時候也可以連同符號」->」一起省略。此外,在返回型別明確的情況下,也可以省略該部分,讓編譯器對返回型別進行推導;

5.:函式體。內容與普通函式一樣,不過除了可以使用引數之外,還可以使用所有捕獲的變數。

與普通函式最大的區別是,除了可以使用引數以外,lambda函式還可以通過捕獲列表訪問一些上下文中的資料。具體地,捕捉列表描述了上下文中哪些資料可以被lambda使用,以及使用方式(以值傳遞的方式或引用傳遞的方式)。語法上,在「」包括起來的是捕捉列表,捕捉列表由多個捕捉項組成,並以逗號分隔。捕捉列表有以下幾種形式:

1.[var]表示值傳遞方式捕捉變數var;

2.[=]表示值傳遞方式捕捉所有父作用域的變數(包括this);

3.[&var]表示引用傳遞捕捉變數var;

4.[&]表示引用傳遞方式捕捉所有父作用域的變數(包括this);

5.[this]表示值傳遞方式捕捉當前的this指標。

上面提到了乙個父作用域,也就是包含lambda函式的語句塊,說通俗點就是包含lambda的「{}」**塊。上面的捕捉列表還可以進行組合,例如:

1.[=,&a,&b]表示以引用傳遞的方式捕捉變數a和b,以值傳遞方式捕捉其它所有變數;

2.[&,a,this]表示以值傳遞的方式捕捉變數a和this,引用傳遞方式捕捉其它所有變數。

不過值得注意的是,捕捉列表不允許變數重複傳遞。下面一些例子就是典型的重複,會導致編譯時期的錯誤。例如:

3.[=,a]這裡已經以值傳遞方式捕捉了所有變數,但是重複捕捉a了,會報錯的;

4.[&,&this]這裡&已經以引用傳遞方式捕捉了所有變數,再捕捉this也是一種重複。

#include

using

namespace std;

typedef

enum

type;

class

calc

intoperator()

(type i)

}private

:int m_x;

int m_y;};

intmain()

用lambda表示式重寫

#include

using

namespace std;

typedef

enum

type;

intmain()

};cout<<

func

(add)

<}

所謂的仿函式(functor),是通過過載()運算子模擬函式形為的類。

因此,這裡需要明確兩點:

1 仿函式不是函式,它是個類;

2 仿函式過載了()運算子,使得它的對你可以像函式那樣子呼叫(**的形式好像是在呼叫函式)。

stl大致分為六大模組:容器(container),演算法(algorithm),迭代器(iterator),仿函式(functor),配接器(adapter),配置器(allocator)。其中仿函式是體積最小,觀念最簡單,但是在stl演算法的搭配中起到了非常重要的作用,這是與簡單的lambda或者指標函式所不同的。

在stl中提供了大量有用的仿函式,比如plus,minus,multiplies,divides,modulus,equal_to,not_equal_to,greater…很多很多,根據傳入的引數的個數我們可以分為只需要接受乙個引數的仿函式(unary_function)和需要接收兩個引數的仿函式(binary_function)。

template

<

typename t>

struct comp};

comp<

int> m_comp_objext;

cout <<

m_comp_objext(6

,3)<< endl;

//使用物件呼叫

cout << comp<

int>()

(1,2

)<< endl;

//使用仿函式實現

在上面的**中,第一種呼叫方式是使用comp的定義的乙個物件,然後通過這個物件來呼叫操作符(),來實現兩個陣列的比較的;對於第二個呼叫comp()(1, 2)是產生乙個臨時(無名的)物件。

C 中Lambda表示式

c 語言還是比較常見的東西,這裡我們主要介紹c lambda表示式,包括介紹乙個lambda就是乙個delegate,乙個delegate指向乙個方法等方面。你有沒有接觸過c lambda表示式,有沒有覺得匿名方法這東西很不錯,減少了很多 阿,但是匿名方法的使用還並不人性化,什麼是人性化呢?比如你可...

C 中lambda表示式

在介紹lambda表示式之前,我想先介紹以下c 標準庫所支援的傳統謂詞以及傳統謂次的不足,而由此才引入的lambda表示式 謂詞是個可呼叫的表示式,其返回結果是乙個能作為條件的值。謂詞分為一元和二元,一元的可呼叫物件只能有乙個引數,二元只能有倆個引數 我們以一元謂詞舉例 c 標準庫中的find if...

C 中的Lambda表示式

c 11開始支援lambda表示式 原文 一段簡單的code 我也不是文藝的人,對於lambda的歷史,以及lambda與c 的那段淵源,我也不是很熟悉,技術人,講究拿 說事。複製 如下 include using namespace std int main return 0 當我第一次看到這段 ...