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

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

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(),

>double);

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

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

正規表示式中如何替換自身,正規表示式如何替換並修改自身的部分內容?

正則式 d 加圓括號表示分組並作為 反向索引 d表示一位數字 替換為 1a 1表示引用第1個組,對每個數字,替換為它本身跟上字母a 我用的emeditor,不同環境正則式語法也有差別。d可用 0 9 替代 1在有些環境中是 1 計名 其實,1 和 2 之間有 b 2 和 3 之間 b 123 s b...

正規表示式如何匹配出最短字串,正規表示式如何匹配除某些字串以外的所有字元

當正規表示式中包含能接受重複的限定符時,通常的行為是 在使整個表示式能得到匹配的前提下 匹配儘可能多的字元。考慮這個表示式 a.b,它將會匹配最長的以a開始,以b結束的字串。如果用它來搜尋aabab的話,它會匹配整個字串aabab。這被稱為貪婪匹配。有時,我們更需要懶惰匹配,也就是匹配儘可能少的字元...

正規表示式如何匹配excel檔案

對應的正規表示式 xls xl xla xlt xlm xlc xlw 如果匹配上面的表示式,則檔案是excel檔案 我在kettle 用 xl?判斷是否是excel檔案的正規表示式 xls.驗證這樣形式的 xls?或者 xlsx?匹配所有.xls結尾的檔案或.xlsx的檔案 對應的正規表示式 xl...