lambda是一種匿名函數,python lambda可以使簡單的函數簡潔的表達,,C++的lambda使類似嵌套函數的功能得以實現 python的lambda VC++14的lambda lambda是vc++獨有的,在vc++11以後,擴展這個功能主要是為了使代碼書寫簡潔,gcc沒有這個功能 直 ...
lambda是一種匿名函數,python lambda可以使簡單的函數簡潔的表達,,C++的lambda使類似嵌套函數的功能得以實現
python的lambda
lambda [arg1[,arg2,arg3....argN]]:expression #用def定義的函數 def foo(): return 'hello world' print(foo()) #用lambda定義的函數 print(lambda:'hello world') #因為沒有給它保存到變數,用完後就失效了,提高了性能 foo_1=lambda:'hello world' print(foo_1()) #加參數 foo_3=lambda a,b=10:a+b print(foo_3(20,10)) foo_4=lambda *args:args print(foo_4(1,2,3,4)) #lambda表達式必須在一行,python一行寫不下可以用\換行 foo_5=lambda **kwargs:\ kwargs print(foo_5(a=1,b=2,c=3)) #還可以變數間賦值 foo_2=foo_1 print(type(foo_2))
VC++14的lambda
lambda是vc++獨有的,在vc++11以後,擴展這個功能主要是為了使代碼書寫簡潔,gcc沒有這個功能
直接使用,對於一些不重覆使用的函數,使用完了自動丟棄
int result = [](int a) {return a*a; }(10); cout << result << endl;
如果要反覆利用,可以使用變數來存儲
auto pow_2 = [](int a) {return a*a; }; cout << pow_2(10) << endl;
lambda的類型
cout << typeid(pow_2).name() << endl; //類型是class <lambda_a10bdd2a3443eccb15c2cfee0f251b1b>
-
Capture 子句(在 C++ 規範中也稱為 lambda 引導。)
-
參數列表(可選)。 (也稱為 lambda 聲明符)
-
可變規範(可選)。
-
異常規範(可選)。
-
尾隨返回類型(可選)。
-
“lambda 體”
1,lambda引導
位置可傳入外部參數,可以通過傳值或傳址方式直接傳入外部數據
[&] 通過引用傳入外部所有變數(地址不會變),[=]通過數值傳入外部所有變數,[i]指定變數傳值,[&i]指定變數傳址
int i = 10; int front = (int)&i; //front是i的地址 cout << i << "-->" << front << endl; //輸出這次地址 cout << &front << endl; //查看front的地址 auto func_1 = [i,&front] { //傳入i(傳值)和front(傳址) int back = (int)&i; cout << i << "-->" << back << //輸出這次地址 "\nback-front=" << abs(back - front) << endl; cout << &front << endl; //再次查看front地址 }; func_1(); //得出 /* 10-->7601564 第一次的i 0073FD90 第一次的front 10-->7601536 第二次的i back-front=28 0073FD90 第二次的front */
struct S { void f(int i); }; void S::f(int i) { [&, i]{}; // 在所有都為引用的時候,可以指定一個不為引用 [&, &i]{}; // 當預設全部引用的時候,不能在指定i為引用 [=, this]{}; // ERROR: this when = is the default [i, i]{}; // 變數不能重覆 }
2,參數列表,auto使用泛型值,或者指定類型
char* a = "aaa"; char* b = "bbb"; [](auto& a, auto& b) { auto temp = a; a = b; b = temp; }(a,b); cout << a <<" "<< b << endl;
3,可變規範
一般情況下,通過傳值獲得的變數不能修改
int n = 0; [&, n]() {++n; }(); //提示錯誤:“n”: 無法在非可變 lambda 中修改通過複製捕獲
mutable規範允許lambda中修改n的值,由於n是通過值捕獲,在lambda結束後,n的值不會變
int m = 0; int n = 0; [&, n](int a)mutable {m = ++n + a; }(4); cout << m << " " << n << endl;
5
0
4,異常規範
5,返回值由char*變成string
char a[10] = "aaa"; char* b = "bbb"; auto merge_str=[](char* a, char* b)->string{ char* result = strcat(a, b); return result; }; cout << merge_str(a, b)<<"-->"<<typeid(merge_str(a, b)).name() << endl;
6,lambda體,可放入任意代碼塊
lambda表達式賦值方法:
//1,可賦值給auto變數 auto f1 = [](int x, int y) {return x + y; }; cout << f1(1,2) << endl; //2,可賦值給函數對象 function<int(int, int)>f2 = [](int x, int y) {return x + y; }; cout << f2(3,4) << endl;
3
7
find_if() 參數一:迭代器頭部 參數二:迭代器尾部 參數三,返回一個指針 返回值:找到的元素的指針
vector<char*>v1 = { "aaa","bbb","ccc","ddd","eee" }; auto result= find_if(v1.begin(), v1.end(), [](char* n) { return n=="ccc"; }); cout << *result << endl;
ccc
lambda嵌套
int result = [](int x) {return [&x](int y) {return (x + y); }(10); }(20); cout << result << endl;
30