如何定義可以接受lambda表示式作為引數的函式

時間 2021-08-30 09:32:05

1樓:我恨我辣麼帥

1. 不必對每個lambda都生成一份dosomething的**,減少編譯時間及二進位制檔案體積

2. 使用template編譯錯誤資訊對新手來說較難看懂

3. 使用template會迫使dosomething的邏輯必須寫在標頭檔案檔案裡,符號定義也不能在自己的編譯單元裡。

如何定義一個可以接受lambda表示式作為引數的函式

2樓:緩緩掉落的松針

public string fun(funcmethod)

string a=fun(()=>string.empty);

如何理解lambda表示式作為函式的引數

怎麼用lambda表示式作為引數傳遞

3樓:愛的那樣鎮

1. 不必對每個lambda都生成一份dosomething的**,減少編譯時間及二進位制檔案體積 2. 使用template編譯錯誤資訊對新手來說較難看懂 3.

使用template會迫使dosomething的邏輯必須寫在標頭檔案檔案裡,符號定義也不能在自己的編譯單元裡。

c#函式func用lambda表示式怎麼寫

4樓:cha唄科技

一般都是匿名的委託方式,直接傳引數進去:

例如:funct=(int x, string b) => (x.tostring() + b);就等於private  string  deletegate  teststring(int x, string b );//定義一個委託,返回值為string型別

private string  test(int x,string b){

return x.tostring() + b;

}teststring t=new teststring(test);

t(44,"bbb");

func就是定義一個委託=private  string  deletegate  teststring(int x string b ),前兩個引數是相應方法的引數型別,最後一個為方法的返回型別。

5樓:匿名使用者

using system;

public class genericfunc

;//lambda表示式

string name = "dakota";

// use delegate instance to call uppercasestring method

console.writeline(convertmethod(name));

}private static string uppercasestring(string inputstring)

}func是個泛型委託,上面是採用 string作為返回值和引數的版本

僅定義一個lambda表示式,會執行嗎

6樓:城南明月羿當年

lambda表示式

c++ 語言中的lambda表示式在很多情況下提供了函式物件的另一種實現機制。lambda表示式並不是stl所特有的,但它廣泛應用於這一環境中。lambda是表示式是定義一個沒有名稱、也不需要顯示類定義的函式物件。

lambda表示式一般作為一種手段,用來將函式作為實參傳遞到另一個函式。相比於定義和建立一個常規的函式物件而言,lambda表示式非常容易使用和理解,而且需要的**也較少。當然,一般而言,lambda表示式並不會取代函式物件。

舉個例子,假設有個包含數值的向量,我們計算此向量的立方值。可以用transform()函式操作,簡單的用lambda表示式完成。

double values = ;

vectordata(values,values+6);

vectorcubes(data.size());

transform(values.begin(),values.end(),cubes.begin(),(double x));

最後這條語句用來計算data中的立方值,並儲存在cubes。這裡簡單提一下transform()函式。它是algorithm標頭檔案中的函式,它有兩個版本。

第一個版本是將一個一元函式物件指定的操作應用到由一對迭代器指定的一個元素集合上,格式如下:

transform(inputiterator begin, inputiterator end, outputiterator result,unaryfuncton f);

transform()的這個版本將一元函式f應用到迭代器begin 和end指定的範圍中的所有元素,並從迭代器result指定的位置開始儲存結果。result迭代器可以與begin迭代器相同,只是在這種情況下將會替換原有的內容。這個函式返回一個迭代器,指向儲存的最後一個結果的下一個位置。

舉例如下:

double values = ;

vectordata(values,values+6);

transform(values.begin(),values.end(),values.begin(),negate);

transform()函式呼叫negate函式物件應用到向量data中的所有元素,結果儲存在data中,並重寫了原始值,執行完後data將包含 -1,-2,-3,-4,-5,-6。函式返回迭代器data.end()。

transform()第二個版本通過來自迭代器指定的兩個範圍內的運算元應用一個二元函式。格式為:

transform(inputiterator1 begin1, inputiterator 1end1, inputiterator2 begin2, outputiterator result,binaryfunction f);

由begin1和end1指定的範圍表示最後一個實參指定的二元函式f的左運算元集合。表示右操作的範圍從begin2迭代器指定的位置開始,這個範圍不需要提供end迭代器,因為這個範圍的元素數量必須與begin1和end1指定的範圍元素個數相同,結果從result迭代器位置開始儲存在這個範圍內。如果希望存回原範圍中,result迭代器可以與begin1相同。

舉例如下:

複製**

double values=;

vectordata(values, values + sizeof values / sizeof values[0]);

vectorsquares(data.size());

transform(data.begin(),data.end(),data.begin(),squares.begin(),multiplies());

ostream_iteratorout(cout,” “);

copy(squares.begin(),squares.end(),out);

複製**

transform()函式通過multiplies函式物件將自身相乘,結果儲存到squares中。最後兩句用一個輸出迭代器輸出內容。

現在回到上文:

transform(values.begin(),values.end(),cubes.begin(),(double x));

開始的方括號稱為lambda引導,它標誌著lambda表示式的開始。後面的圓括號中的是lambda的引數列表,這與普通函式相同。此例中只有一個形參x。

注意,lambda的引數列表不允許指定形參的預設值,並且引數列表的長度是不可變的。大括號中的是lambda的主體,此例只有一條return語句,當然可以包含多條語句。大家可能注意到這裡沒有返回型別說明。

當lambda表示式的主體是一條單一返回語句,而該語句在lambda表示式主體中返回一個值時,返回型別預設為返回值的型別。否則,返回void。當然可以指定返回型別,如下:

(double x) ->double //指定返回double

capture子句

lambda表示式引導可以包含一個捕獲子句,用來確定lambda主體如何訪問封閉作用域中的變數。前面lambda表示式方括號之間沒有內容,表面封閉作用域沒有可以再lambda表示式中訪問的變數。若要訪問,第一種是方括號之間是 = ,則lambda主體可以按值訪問封閉作用域的所有自動變數,但不會修改原始變數。

另一中是方括號之間是 & ,則封閉作用域的所有自動變數按應用訪問,因此lambda表示式可以修改變數值。例如:

複製**

double index = 3.0;

double values = ;

vectordata(values,values+6);

vectorcubes(data.size());

transform(values.begin(),values.end(),cubes.begin(),

[=](double x));

複製**

需要主要的是,這與按值傳遞實參根本不同,變數index的值可用在lambda中,但不能更新index的副本。如:

transform(values.begin(),values.end(),cubes.begin(),

[=](double x) ->double);

以上是錯誤的,若要修改變數的臨時副本,則通過新增mutable關鍵字實現。如:

transform(values.begin(),values.end(),cubes.begin(),

[=](double x)mutable ->double);

現在可以修改作用域中的任意變數副本,而不會修改原始值。

transform(values.begin(),values.end(),cubes.begin(),

[&](double x)mutable ->double);

現在採用按引用使用,則會改變index的原始值。

若要捕獲一個特定的變數,則:

transform(values.begin(),values.end(),cubes.begin(),

[&index](double x)mutable ->double);

這樣,只捕獲index,如要捕獲多個變數,中間用逗號隔開即可。

lambda也可以包含throw()異常說明,如:

transform(values.begin(),values.end(),cubes.begin(),

[&index](double x)mutable throw()->double);

如果想要包含mutable說明和throw()說明,則中間必須用一個或多個空格隔開。

現在綜合看個例項,用以前說過的函式模板實現。

定義在對稱區間上的任何函式都可以唯一的表示成偶函式和

設f x h x g x 其中h x 是偶函式,g x 是奇函式 則f x h x g x h x g x 由此兩式可解得得h x f x f x 2,g x f x f x 2 顯然此解滿足條件,且是唯一的,即 對稱區間上的任何函式都可以唯一的表示成一個偶函式和一個奇函式之和即f x f x f ...

vb如何定義變數每過程都可以用,VB如何定義乙個變數,每乙個過程都可以用?

vb可以在標準模組定義乙個公用變數,這樣就可以每乙個過程中都可以使用。例如 data.bas在模組中新建乙個通用模組,然後在新建模組裡輸入 public 變數名 as 資料型別。舉個例子,public number as integer在別的窗體中要引用number這個數,就寫 data.numbe...

可以幫我列張計畫表嗎,關於如何提高寫作水平,什麼時候該做什麼,謝謝

我認為的提高寫作技能,不包括多練多寫,因為這樣,會讓你在腦海中有乙份壓迫感,這種壓迫感會讓你的神經末梢處於極度興奮的狀態,以至於你在練筆中寫出的幾乎是天馬行空的想象,這樣的作品看似精美,比你平時好的太多了,但是,一旦你在進入考場或是離開這種興奮感時,你腦海中的寫作技巧會瞬間坍塌,導致寫出的文章沒有原...