C++11 提供了對匿名函數的支持,稱為 Lambda 函數(也叫 Lambda 表達式)。Lambda表達式完整的聲明格式如下:
[capture list] (params list) mutable exception-> return type { function body }
各項具體含義如下:
- capture list:捕獲外部變量列表
- params list:形參列表
- mutable指示符:用來說用是否可以修改捕獲的變量
- exception:異常設定
- return type:返回類型
- function body:函數體
此外,還可以省略其中的某些成分來聲明“不完整”的Lambda表達式,常見的有以下幾種:
- [capture list] (params list) -> return type {function body}
- [capture list] (params list) {function body}
- [capture list] {function body}
下面就舉一個實例(文件名:lambda.cpp):
// g++ -std=c++11 lambda.cpp
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
bool cmp(int, int);
void print_vector(vector<int> *);
int main() {
vector<int> a{3, 1, 2};
vector<int> b(a);
print_vector(&a);
sort(a.begin(), a.end(), cmp);
print_vector(&a);
print_vector(&b);
sort(b.begin(), b.end(), [](int a, int b)->bool{return a<b;}); // lambda表達式
print_vector(&b);
cout << "End." << endl;
}
bool cmp(int a, int b) {
return a < b;
}
void print_vector(vector<int> *v) {
// 使用迭代器遍歷vector
for (vector<int>::iterator it=v->begin(); it!=v->end(); it++) {
cout << *it << " ";
}
cout << endl;
}
編譯運行及結果:
$ g++ -std=c++11 lambda.cpp
$ ./a.out
3 1 2
1 2 3
3 1 2
1 2 3
End.
參考:
c++函數 | 菜鳥教程
http://www.runoob.com/cplusplus/cpp-functions.html
C++ 11 Lambda表達式
https://www.cnblogs.com/DswCnblog/p/5629165.html