玩命加载中 . . .

lamda表达式


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


文章作者: kunpeng
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 kunpeng !
  目录