在c語言中,可呼叫物件僅有函式指標。但在c++中,可呼叫物件增加了兩類,
// lambda
[ 《捕獲列表》 ] ( 《引數列表》 ) [options]
// 返回值即為乙個lambda表示式,每個lambda表示式在全域性範圍上都屬於特有的乙個類別
// 寫出類別很難,所以用auto關鍵字指定收變數的型別
// 譬如
auto add = (int lv, int rv) ;
// 例子
// 實現將外層作用域的乙個int值輸出
; printval();
val = 100;
printval();
}
輸出結果為
10
10
為什麼第二行輸出不是100呢?
是因為捕獲列表中寫了「val」,預設為值捕獲,如果想要引用捕獲則寫作[&val],輸出則為10 100,值得注意的是,上述lambda表示式沒有寫小括號,這是因為在不需要引數的時候,小括號可以省略
可以接受lambda表示式的stl-algorithm有很多,比如
// a vectorv 逆序排序
std::sort(v.begin(), v.end(), ( int n1, int n2 ) );
templateinline void sort(
_randomaccessiterator __first, _randomaccessiterator __last,
_compare __comp);
// __comp可以接受lambda表示式,並且也可以接受functor或函式指標
std::functionfunc() ;
}// in main-function
func()(10); // stdout : 10
auto func() ;
}// in main-function
func()(10); // stdout : 10
// g++編譯選項新增 -std=c++14
在c++11之前,標準庫提供了bind1st和bind2nd用於將乙個二元函式裝飾為一元函式,c++11後標準庫提供了std::bind函式,將利用佔位符(std::placeholders::_1、_2、…)可以對乙個函式靈活裝飾(改變引數列表的順序、個數),利用lambda表示式也可以實現這種效果。
利用lambda實現bind效果的核心就是利用捕獲列表,譬如
// 假如由乙個函式bool greater(int lv, int rv),返回是否lv > rv,有這麼乙個場景,
// 有乙個有序容器,一群數字,用這一群數字切分這個有序容器。
// 利用std::find_if
std::vectornums = ; // 待切分的容器
std::vectorsliceflag = ; // 切分標誌
std::vector::iterator> res = ; // 用來儲存切分點
auto greaterthan = (int lv) ;
}; //
for (auto & f : sliceflag)
res.push_back(nums.end());
// test
for (int i = 0; i < res.size() - 1; ++i) );
std::cout << "\n";
}/****************************stdout********************************/
ps ~~~> .\test
-3, 1, 1,
3, 3, 4, 4,
5, 6, 8, 8,
10, 12,
c風格的可呼叫物件即函式指標作為元素存入容器時比較簡單的,但是對於lambda表示式,每個表示式都屬於乙個特有的型別,為了將很多lambda存入容器需要借助std::function,函式簽名同為type(args…)的lambda可以轉化為std::function,然後再將其都存入元素型別為std::function的容器即可,例子
int main () },
},},}};
std::string exp;
while (true) );
int rv = atoi(exp.c_str() + (iter - exp.begin()) + 1); // 運算子右值
std::string op; op.push_back(*iter);
std::printf("--> %d\n", opts.at(op)(lv, rv));
}return 0;
}// test
ps \\\\> ./test
1+1--> 2
2/3--> 0
456+9544
--> 10000
12*12
--> 144
1-90
--> -89
有時候,connect到的槽函式僅作為槽函式使用,沒有必要封成乙個member,使用lambda是乙個較好的選擇,這種情況下,原來形式的connect的第3個引數(接受者)就沒有用了。
// in constructor of class mainwidget(繼承自qwidget)
// 有乙個qpushbutton的指標, 名字為 pexitbutton
connect(pexitbutton, &qpushbutton::clicked, [this] ); // 需要注意的是,要捕獲this
注:有時候可能要在qt的.pro檔案中的config += c++11 c Lambda表示式簡介
c 11標準的lambda引入的主要目的是 能夠將類似於函式的表示式用作接受函式指標或函式符的函式引數,因此,典型的lambda表示式是測試表示式或者比較表示式,可編寫為一條語句,這使得lambda簡潔而易於理解。1 乙個lambda表示式有如下型別 capture list parameter l...
C lambda表示式末尾 的作用
includeusing namespace std int main auto u int a,int b cout 等價於 includeusing namespace std int main auto u int a,int b cout 細節 1.第二種方式必須帶返回值,否則會 error...
lambda表示式 C Lambda表示式
lambda宣告 lambda introducer。在內部,你可以指明乙個capture用來處理外部作用域內未被傳遞為實參的資料。意味著外部作用域以by value的方式傳遞給lambda。在lamdba中不能改變其值 為什麼?意味著外部作用域以by reference的方式傳遞給lambda。因...