lamda表达式
以[]
开头,后面是参数列表,比函数对象更简洁
class Print
{
public:
void operator () (const int& val) {cout << val << " ";}
};
for_each(vi.begin(), vi.end(), Print());
可以简写为
for_each(vi.begin(), vi.end(), [](const int& val) {cout << val << " ";});
[]
内可以接受参数
class Greater
{
public:
bool operator () (const int& val) {return (val > 5);}
};
auto it = find_if(vi.begin(), vi.end(), Greater());
可以简写为
int num = 5;
auto it = find_if(vi.begin(), vi.end(), [num](const int& val) {return (val > num);});
添加关键字multable可以在lamda表达式内部修改通过[]传入的参数,离开lamda表达式之后就无效了,要在外部有效,需要按引用传递
可以用->
指定返回类型
[State1, State2](Type var1, Type var2) -> ReturnType
{ return (value or expression); }
二元lamda表达式
两个vector
中的元素对应相乘
transform(vi.begin(), vi.end(), multiple.begin(), result.begin(), [](int& a, int& b) {return a * b;});
int main(int argc, char const *argv[])
{
vector<int> vi;
for (int i = 0; i < 10; i++) {
vi.push_back(i);
}
for_each(vi.begin(), vi.end(), [](const int& val) {cout << val << " ";});
cout << endl;
vector<int> multiple;
for (int i = 10; i < 20; i++) {
multiple.push_back(i);
}
for_each(multiple.begin(), multiple.end(), [](const int& val) {cout << val << " ";});
cout << endl;
vector<int> result;
result.resize(vi.size());
transform(vi.begin(), vi.end(), multiple.begin(), result.begin(), [](int& a, int& b) {return a * b;});
for_each(result.begin(), result.end(), [](const int& val) {cout << val << " ";});
cout << endl;
return 0;
}
0 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19
0 11 24 39 56 75 96 119 144 171
通过lamda表达式自定义sort
for_each(result.begin(), result.end(), [](const int& val) {cout << val << " ";});
sort(result.begin(), result.end(), [](int& a, int& b) {return a > b;});
for_each(result.begin(), result.end(), [](const int& val) {cout << val << " ";});
0 11 24 39 56 75 96 119 144 171
171 144 119 96 75 56 39 24 11 0 // 自定义从大到小排序
输出满足条件的元素个数
// 输出偶数个数
cout << count_if(vi.begin(), vi.end(), [](const int& val) {return !(val % 2);}) << endl;
0 1 2 3 4 5 6 7 8 9
5