lambda

P28  介绍了lambda表达式基本语法

P475  介绍了STL函数对象及Lambda

完整的lambda表达式结构

这里假设我们定义了一个如上图的lambda表达式。现在来介绍途中标有编号的各个部分是什么意思。

  1. Lambda表达式的引入标志,在‘[]’里面可以填入‘=’或‘&’表示该lambda表达式“捕获”(lambda表达式在一定的scope可以访问的数据)的数据时以什么方式捕获的,‘&’表示一引用的方式;‘=’表明以值传递的方式捕获,除非专门指出。
  2. Lambda表达式的参数列表
  3. Mutable 标识
  4. 异常标识
  5. 返回值
  6. “函数”体,也就是lambda表达式需要进行的实际操作

示例

代码:

#include <iostream> 
using namespace std;

int main()
{
    int x = 3, y = 5;
    auto fun1 = []{ cout << "hello" << endl; };
    auto fun2 = [&]
    {
        cout << "x:" << x++ << endl;
        cout << "y:" << y++ << endl;
    };
    auto fun3 = [](int x, int y){return x + y; };
    fun1();
    fun2();
    fun2();
    cout<<fun3(6, 8);
    system("pause");
    return 0;
}

 输出:

解释:

fun1以最简单的lambda表达式,也就是[]{}

fun2指出使用引用的方式传值,x,y在函数使用中改变其值

fun3标明lambda可以拥有参数,指明小括号内

注意:

1. lambda的类型,是个不具名的functiong object,每个lambda表达式的类型都是独一无二的,如果想根据该类型声明对象,可借助于template和auto

2. 使用过程中容易出错的是 auto fun[]{};和fun();

使用

lambda表达式常和STL一起使用

与generate和for_each

#include <iostream>
#include <algorithm>
#include <ctime>
using namespace std;

int main()
{
    int a[10] = { 0 };
    srand(time(NULL));
    generate(a, a + 10, [](){ return rand() % 100; });
    cout << "before sort: " << endl;
    for_each(a, a + 10, [&](int i){ cout << i << " "; });
    cout << endl;
    cout << "After sort" << endl;
    sort(a, a + 10);
    for_each(a, a + 10, [&](int i){ cout << i << " "; });

    system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/raichen/p/5619318.html