IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++11 lambda表达式 -> 正文阅读

[C++知识库]C++11 lambda表达式

1 什么是lambda表达式

是一个闭包;是一个能够在作用域中捕获变量的匿名函数对象。

2 什么是lambda组成部分

在这里插入图片描述
1、捕获:可以为0或者多个分割列表
2、参数列表:可有可无
3、mutable: 可变规范可有可无
4、throw(): 异常规范 可有可无
5、返回类型:可有可无
6、lambda本地

2.1 []捕获

2.1.1 捕获形式:

  1. [] : 不捕获任何外部变量
  2. [=] : 以值的形式捕获所有外部变量
  3. [var1, var2, … ] : 以值的形式捕获多个外部变量(变量用逗号分)
  4. [&var1, &var2,…] : 以引用的形式捕获多个外部变量(变量用逗号分割)
  5. [&] : 以引用的形式捕获所有外部变量
  6. [=,&var1] :以引用形式捕获var1,其余外部变量以值的形式捕获
  7. [&,var1] :以值形式捕获var1,其余外部变量以引用的形式捕获
  8. [this] : 以值的形式捕获this指针

2.1.2 []不捕获任何外部变量:

#include <algorithm>
#include <iostream>

using namespace std;

// 测试不捕获任何变量
void fun1(){
   int var1 = 1;
   int var2 = 2;
   []() noexcept {  
       int i = var1;
       int j = var2;
       cout << i << " " << j << endl;
   };
}

int main(){
   fun1();
   return 0;
}

编译报错:
lambda不捕获变量,内部就不能使用。
在这里插入图片描述

2.1.2 修改非mutable值捕获:

#include <algorithm>
#include <iostream>

using namespace std;

//测试修改值捕获
void fun2(){
    int var1 = 1;
    int var2 = 2;
    [var1, var2]() noexcept {  
        int i = var1;
        int j = ++var2;
        cout << i << " " << j << endl;
    };
}
int main(){
    fun2();
    return 0;
}

编译报错:
var2是值捕获不能被修改
在这里插入图片描述

2.1.3 重复捕获:

#include <algorithm>
#include <iostream>

using namespace std;

//重复捕获
void fun3(){
    int var1 = 1;
    int var2 = 2;
    [=, var2]() noexcept {  
        int i = var1;
        int j = var2;
        cout << i << " " << j << endl;
    }();
}
int main(){
    fun3();
    return 0;
}

编译告警:
显示的var值拷贝和默认的全值拷贝冗余
在这里插入图片描述

2.1.4 混合捕获:

#include <algorithm>
#include <iostream>

using namespace std;


void fun4(){
    int var1 = 1;
    int var2 = 2;
    int var3 = 3;
    //值捕获
    [=]() noexcept {  
        int i = var1;
        int j = var2;
        cout << "i=" << i << " " << "j=" << j << endl;
    }();

    //引用捕获,修改外部变量值i,j的值
    [&]() noexcept {  
        int i = ++var1;
        int j = ++var2;
        cout << "i=" << i << " " << "j=" << j << endl;
    }();

    //var1引用捕获,var2,var3值捕获
    [=, &var1]() noexcept {  
        int i = ++var1;
        int j = var2;
        int k = var3;
        cout << "i=" << i << " " << "j=" << j << 
        " " << "k=" << k << endl;
    }();
}

int main(){
    fun4();
    return 0;
}

输出结果:
在这里插入图片描述

2.2 参数列表

Lambda表达式中传递参数和有名函数参数列表一样

2.3 mutable

#include <algorithm>
#include <iostream>

using namespace std;


void fun6(){
    int var1 = 1;
    int var2 = 2;
    [=]() mutable noexcept {  
        int i = ++var1;
        int j = ++var2;
        cout << i << " " << j << endl;
    }();
}

int main(){

    fun6();
    return 0;
}

输出结果:
在这里插入图片描述

2.4 noexcep/throw()

noexcept == throw()  == noexcept(true)
noexcept目的是会防止异常扩散。如果出现异常,会调用terminate()->abort()结束程序。
#include <algorithm>
#include <iostream>

using namespace std;


void fun7(){
    int var1 = 1;
    int var2 = 2;
    [=]() mutable noexcept {  
        int i = ++var1;
        int j = ++var2;
        cout << i << " " << j << endl;
        throw(5);
    }();
}

int main(){

    fun7();
    return 0;
}

运行结果崩溃

在这里插入图片描述

3 lambda优点

1、简洁
2、距离执行代码近,便于阅读理解代码。
3、可以捕获作用域中的任何变量

4 lambda可以直接使用无需捕获的变量类型

全局变量,thread_local 变量,static变量都是可以直接使用,无需捕获。

#include <algorithm>
#include <iostream>

using namespace std;
int g_a = 90;
thread_local unsigned int rage = 77;

void fun8(){
    static int var1 = 1;
    
    const int d1 = 5;
    []() mutable noexcept {  
        int j = ++var1;
        ++g_a;
        ++rage;
        cout << "g_a:" << g_a << " "<< " j:" << j << " "<< " rage:" << rage << endl;
        cout << "d1:" << d1 << endl;
    }();
}


int main(){

    fun8();
    return 0;
}

输出结果:
在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-05 11:51:56  更:2021-12-05 11:52:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:11:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码