016-Lamda表达式、C++14和C++17新特性

《C++文章汇总》
上一篇介绍了《015-类型转换和C++11新特性》,本文介绍Lamda表达式。

1.Lamda

◼ Lambda表达式
有点类似于JavaScript中的闭包、iOS中的Block,本质就是函数
完整结构: [capture list] (params list) mutable exception-> return type { function body } ✓capture list:捕获外部变量列表
✓params list:形参列表,不能使用默认参数,不能省略参数名
✓ mutable:用来说用是否可以修改捕获的变量
✓ exception:异常设定
✓return type:返回值类型
✓function body:函数体
有时可以省略部分结构
✓[capture list] (params list) -> return type {function body}
✓[capture list] (params list) {function body}
✓[capture list] {function body}

 int main(){
    ([]{
        cout << "func()" << endl;
    })();
    getchar();
    return 0;
}
//输出
func()

1.使用指针变量或auto保存lamda表达式

 int main(){
    ([]{
        cout << "func()" << endl;
    })();
    void (*p)() = []{
        cout << "func()" << endl;
    };
    p();
    
    auto p0 = []{
        cout << "func()-----" << endl;
    };
    p0();
    p0();
    getchar();
    return 0;
}
//输出
func()
func()
func()-----
func()-----

2.带参数和返回值的lamda表达式

auto p1 = [](int a,int b)->int{
        return a+b;
};
cout << p1(10,20) << endl;
//输出
30

3.lamda本质是函数
4.通常我们可以传入函数指针来调用一个函数,有了lamda表达式之后可以直接将函数写入,一下是传入函数指针的方式来调用函数

int add(int a,int b){
    return a+b;
}
int sub(int a,int b){
    return a-b;
}
int multip(int a,int b){
    return a*b;
}
int divide(int a,int b){
    return a/b;
}
int calculate(int v1,int v2,int (*func)(int,int)){
    return func(v1,v2);
}
int main(){
    cout << calculate(20, 10, add) << endl;
    cout << calculate(20, 10, sub) << endl;
    cout << calculate(20, 10, multip) << endl;
    cout << calculate(20, 10, divide) << endl;
    getchar();
    return 0;
}
//输出
30
10
200
2

直接传入lamda表达式

cout << calculate(20, 10, [](int v1,int v2){return  v1+v2;}) << endl;
cout << calculate(20, 10, [](int v1,int v2){return  v1-v2;}) << endl;
cout << calculate(20, 10, [](int v1,int v2){return  v1*v2;}) << endl;
cout << calculate(20, 10, [](int v1,int v2){return  v1/v2;}) << endl;

4.lamda捕获外界变量,写入[]中,=表示全部捕获,默认都是值捕获

int a=10;
int b=20;
//值捕获
auto func = [a,b]{
    cout << a << endl;
    cout << b << endl;
};
func();
//输出
10
20

int a=10;
int b=20;
//值捕获
auto func = [=]{
    cout << a << endl;
    cout << b << endl;
};
func();
//输出
10
20 

int a=10;
//值捕获
auto func = [a]{
    cout << a << endl;
};
a=20;
func(); 
//输出
10
图片.png

5.地址捕获,lamda中修改外界变量的值

auto func = [&a]{
    cout << a << endl;
};
a=20;
func();
//输出
20

auto func = [&a]{
    a++;
};
func();
cout << a << endl;
//输出
11

6.mutable

auto func = [a]()mutable{
    a++;
    cout << "lamda =" << a << endl;
};
func();
cout << a << endl;
//输出
lamda =11
10

2.C++14新特性

◼ 泛型Lambda表达式

auto func1 = [](auto v1,auto v2){return v1+v2;};
cout << func1(10, 12.5) << endl;
//输出
22.5

◼ 对捕获的变量进行初始化

int b;
auto func0 = [b=10](){
    cout << b << endl;
};
func0();
//这里仍然未初始化
cout << b << endl;
//输出
10
32766

3..C++17新特性

◼ 可以进行初始化的if、switch语句

if (int a = 10;a>10) {
    
}else{
    
}
switch (int b = 10;b) {
    case 1:
        
        break;
    case 2:
        break;
    case 10:
        break;
    default:
        break;
}
图片.png

你可能感兴趣的:(016-Lamda表达式、C++14和C++17新特性)