当前位置: 首页 > news >正文

C++ lambda表达式的捕获原理

目录

  • C++ Lambda表达式捕获机制的详细原理分析
    • Lambda的本质机制
    • 关键实现细节
    • 特殊捕获方式
    • [ ]空捕获
    • [&]全引用捕获
    • [=]全值(拷贝)捕获
    • 混合捕获
      • [=,&variable]拷贝及部分引用捕获
      • [&,variable]引用及部分拷贝捕获
    • 显式捕获
      • [variable]拷贝捕获部分变量
      • [&variable]引用捕获部分变量
    • [this]拷贝捕获this

C++ Lambda表达式捕获机制的详细原理分析

Lambda的本质机制

Lambda表达式本质是编译器生成的匿名类,通过重载operator()实现函数调用运算符。捕获列表中的变量会被转换为该类的成员变量:

// 原始Lambda
auto f = [x](){ return x+1; };// 等效编译器生成类
class __lambda_XXXX {int x;  // 捕获变量存储为成员变量
public:int operator()() const { return x+1; }
};

关键实现细节

  1. 捕获时机:发生在lambda表达式定义时,后续外部变量修改不影响已捕获的值(引用捕获除外)

  2. 成员初始化

    __lambda_XXXX{var} // 值捕获时调用拷贝构造
    __lambda_XXXX{std::move(var)} // C++14支持移动捕获
    
  3. 生命周期问题:引用捕获必须确保外部变量生命周期长于lambda对象

  4. 性能影响

    • 值捕获:可能引起拷贝开销
    • 引用捕获:无拷贝开销,但有悬空引用风险

特殊捕获方式

  1. 初始化捕获(C++14)

    [ptr = std::move(unique_ptr)]{} // 移动语义捕获
    
  2. 结构化绑定捕获(C++17):

    auto [a, b] = getPair();
    auto f = [a, b](){...}; 
    

[ ] 不截取任何变量
[&]截取外部作用域中所有变量,并作为引用在函数体中使用
[=] 截取外部作用域中所有变量,并拷贝一份在函数体中使用
[=,&variable]   截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对以逗号分隔variable使用引用
[&,variable] 以引用的方式捕获外部作用域中所有变量,对以逗号分隔的变量列表variable使用值的方式捕获
[variable] 对以逗号分隔的变量列表variable使用值的方式捕获
[&variable] 对以逗号分隔的变量列表variable使用引用的方式捕获
[this] 截取当前类中的this指针。如果已经使用了&或者=就默认添加此选项。

cppinsights将高级C++代码转换为其等效的低级代码表示;

[ ]空捕获

  • 原理:不生成任何成员变量,相当于没有状态的函数对象
  • 限制:只能访问全局变量和静态变量

[&]全引用捕获

  • 原理:所有捕获变量存储为引用类型成员

  • 底层实现:

    class __lambda_7_11 {std::string& s; // 引用类型成员int& a;         // 引用类型成员
    public:void operator()() const {s += std::to_string(a);a += 100; // 直接修改原变量}
    };
    
  • 特性:修改会影响外部变量,需注意生命周期问题

源:

#include <string>
#include <iostream>
int main()
{int a = 10;std::string s = "hello";auto f = [&](){s += std::to_string(a);a += 100;};std::cout << a << std::endl;f();return 0;
}

cppinsights展开:

#include <string>
#include <iostream>
int main()
{int a = 10;std::basic_string<char> s = std::basic_string<char>("hello", std::allocator<char>());class __lambda_7_11{public:inline /*constexpr */ void operator()() const{s.operator+=(std::to_string(a));a = a + 100;}private:std::basic_string<char>& s;int& a;public:__lambda_7_11(std::basic_string<char>& _s, int& _a): s{ _s }, a{ _a }{}};  // 函数对象__lambda_7_11 f = __lambda_7_11{ s, a };          // 构造函数std::cout.operator<<(a).operator<<(std::endl);  // 输出f.operator()();                                 // 调用函数return 0;
}

[=]全值(拷贝)捕获

  • 原理:所有变量存储为值类型成员

  • 底层实现:

    class __lambda_9_11 {std::string s;  // 值类型成员int a;          // 值类型成员 
    public:void operator()() const { // 默认const修饰std::cout << s << a;  // 只能读取不能修改}
    };
    
  • mutable修饰:移除operator()的const限定,允许修改副本

    mutable lambda允许:
    void operator()() { // 非const版本a += 100; // 修改副本值
    }
    

源:

#include <string>
#include <iostream>int main()
{int a = 10;std::string s = "hello";//  默认是常函数void operator()() constauto f = [=]() {std::cout << "Lambda = " << s << std::endl;std::cout << "Lambda = " << a << std::endl;// 报错:表达式必须是可修改的左值// a += 100;};// 捕获时机:发生在lambda表达式定义时,后续外部变量修改不影响已捕获的值(引用捕获除外)a = 100;std::cout << "a = " << a << std::endl;f();// 设置mutable,使得void operator()()可以修改捕获的变量的副本(非本身)auto f2 = [=]()mutable {std::cout << "Lambda = " << s << std::endl;std::cout << "Lambda = " << a << std::endl;// 这里的a是外部变量的副本s += std::to_string(a); // 无法改变外部变量sa += 100;				// 可以改变外部变量astd::cout << "Lambda = " << s << std::endl;std::cout << "Lambda = " << a << std::endl;};f2();// 没有改变外部变量std::cout << "s = " << s << std::endl;// s = hello std::cout << "a = " << a << std::endl;// a = 10return 0;
}
/*
a = 100
Lambda = hello
Lambda = 10
Lambda = hello
Lambda = 100
Lambda = hello100
Lambda = 200
s = hello
a = 100
*/

cppinsights展开:

#include <string>
#include <iostream>int main()
{int a = 10;std::basic_string<char> s = std::basic_string<char>("hello", std::allocator<char>());class __lambda_9_11{public:inline /*constexpr */ void operator()() const{std::operator<<(std::operator<<(std::cout, "Lambda = "), s).operator<<(std::endl);std::operator<<(std::cout, "Lambda = ").operator<<(a).operator<<(std::endl);}private:std::basic_string<char> s;int a;public:// inline __lambda_9_11 & operator=(const __lambda_9_11 &) /* noexcept */ = delete;// inline ~__lambda_9_11() noexcept = default;__lambda_9_11(const std::basic_string<char>& _s, int& _a): s{ _s }, a{ _a }{}};__lambda_9_11 f = __lambda_9_11{ s, a };// 捕获时机:发生在lambda表达式定义时,后续外部变量修改不影响已捕获的值(引用捕获除外)a = 100;std::operator<<(std::cout, "a = ").operator<<(a).operator<<(std::endl);f.operator()();class __lambda_22_12{public:inline /*constexpr */ void operator()(){std::operator<<(std::operator<<(std::cout, "Lambda = "), s).operator<<(std::endl);std::operator<<(std::cout, "Lambda = ").operator<<(a).operator<<(std::endl);s.operator+=(std::to_string(a));a = a + 100;std::operator<<(std::operator<<(std::cout, "Lambda = "), s).operator<<(std::endl);std::operator<<(std::cout, "Lambda = ").operator<<(a).operator<<(std::endl);}private:std::basic_string<char> s;int a;public:// inline __lambda_22_12 & operator=(const __lambda_22_12 &) /* noexcept */ = delete;// inline ~__lambda_22_12() noexcept = default;__lambda_22_12(const std::basic_string<char>& _s, int& _a): s{ _s }, a{ _a }{}};__lambda_22_12 f2 = __lambda_22_12{ s, a };f2.operator()();std::operator<<(std::operator<<(std::cout, "s = "), s).operator<<(std::endl);std::operator<<(std::cout, "a = ").operator<<(a).operator<<(std::endl);return 0;
}

混合捕获

形式原理成员变量类型
[=, &var]除var外全值捕获,var引用捕获值类型成员 + var引用成员
[&, var]除var外全引用捕获,var值捕获引用类型成员 + var值成员
[var1, &var2]显式指定值/引用捕获var1值成员 + var2引用成员

示例混合捕获展开代码:

// [=,&s] 捕获
class __lambda_9_11 {std::string& s; // 引用捕获int a;          // 值捕获
};

[=,&variable]拷贝及部分引用捕获

源:

#include <string>
#include <iostream>int main()
{int a = 10;std::string s = "hello";//  默认是常函数void operator()() constauto f = [=,&s]() {s += std::to_string(a);std::cout << a << std::endl;// 报错:表达式必须是可修改的左值// a += 100;};std::cout << s << std::endl;f();std::cout << s << std::endl;	// hello10return 0;
}

cppinsights展开:

#include <string>
#include <iostream>int main()
{int a = 10;std::basic_string<char> s = std::basic_string<char>("hello", std::allocator<char>());class __lambda_9_11{public:inline /*constexpr */ void operator()() const{s.operator+=(std::to_string(a));std::cout.operator<<(a).operator<<(std::endl);}private:std::basic_string<char>& s;int a;public:__lambda_9_11(std::basic_string<char>& _s, int& _a): s{ _s }, a{ _a }{}};__lambda_9_11 f = __lambda_9_11{ s, a };std::operator<<(std::cout, s).operator<<(std::endl);f.operator()();std::operator<<(std::cout, s).operator<<(std::endl);return 0;
}

[&,variable]引用及部分拷贝捕获

源:

#include <string>
#include <iostream>int main()
{int a = 10;std::string s = "hello";//  默认是常函数void operator()() constauto f = [&,a]() {s += std::to_string(a);std::cout << a << std::endl;// 报错:表达式必须是可修改的左值;“a” : 无法在非可变 lambda 中修改通过复制捕获// a += 100;};std::cout << s << std::endl;	// hellof();std::cout << s << std::endl;	// hello10return 0;
}

cppinsights展开:

#include <string>
#include <iostream>int main()
{int a = 10;std::basic_string<char> s = std::basic_string<char>("hello", std::allocator<char>());class __lambda_9_11{public:inline /*constexpr */ void operator()() const{s.operator+=(std::to_string(a));std::cout.operator<<(a).operator<<(std::endl);}private:int a;std::basic_string<char>& s;public:__lambda_9_11(int& _a, std::basic_string<char>& _s): a{ _a }, s{ _s }{}};__lambda_9_11 f = __lambda_9_11{ a, s };std::operator<<(std::cout, s).operator<<(std::endl);f.operator()();std::operator<<(std::cout, s).operator<<(std::endl);return 0;
}

显式捕获

  • 值捕获

    [var]
    
    • 生成const成员变量
    • 需mutable才能修改副本,修改不影响外部变量
  • 引用捕获

    [&var]
    
    • 生成引用类型成员
    • 修改直接影响外部变量

[variable]拷贝捕获部分变量

源:

#include <string>
#include <iostream>int main()
{int a = 10;std::string s = "hello";//  默认是常函数void operator()() constauto f = [a]() {// 报错:封闭函数局部变量不能在 lambda 体中引用,除非其位于捕获列表中// std::cout << s << std::endl;std::cout << a << std::endl;// 报错:表达式必须是可修改的左值;“a” : 无法在非可变 lambda 中修改通过复制捕获// a += 100;};std::cout << s << std::endl;	// hellof();return 0;
}

cppinsights展开:

#include <string>
#include <iostream>int main()
{int a = 10;std::basic_string<char> s = std::basic_string<char>("hello", std::allocator<char>());class __lambda_9_11{public:inline /*constexpr */ void operator()() const{std::cout.operator<<(a).operator<<(std::endl);}private:int a;public:__lambda_9_11(int& _a): a{ _a }{}};__lambda_9_11 f = __lambda_9_11{ a };std::operator<<(std::cout, s).operator<<(std::endl);f.operator()();return 0;
}

[&variable]引用捕获部分变量

源:

#include <string>
#include <iostream>int main()
{int a = 10;std::string s = "hello";//  默认是常函数void operator()() constauto f = [&a]() {// 报错:封闭函数局部变量不能在 lambda 体中引用,除非其位于捕获列表中// std::cout << s << std::endl;a += 100;};std::cout << a << std::endl;		// 10f();std::cout << a << std::endl;		// 110return 0; 
}

cppinsights展开:

#include <string>
#include <iostream>int main()
{int a = 10;std::basic_string<char> s = std::basic_string<char>("hello", std::allocator<char>());class __lambda_9_11{public:inline /*constexpr */ void operator()() const{a = a + 100;}private:int& a;public:__lambda_9_11(int& _a): a{ _a }{}};__lambda_9_11 f = __lambda_9_11{ a };std::cout.operator<<(a).operator<<(std::endl);f.operator()();std::cout.operator<<(a).operator<<(std::endl);return 0;
}

[this]拷贝捕获this

  • 原理:捕获当前对象的this指针

  • 实现方式:

    class __lambda_13_12 {MyClass* __this; // 存储this指针
    public:void operator()() const {__this->a += 100; // 访问成员变量}
    };
    
  • 注意:当使用[=][&]时会隐式捕获this

源:

#include <string>
#include <iostream>class MyClass
{
public:MyClass() = default;~MyClass() = default;void lambdaCapture(){//  默认是常函数void operator()() constauto f = [this]() {// 报错:封闭函数局部变量不能在 lambda 体中引用,除非其位于捕获列表中// std::cout << s << std::endl;a += 100;};std::cout << a << std::endl;		// 10f();std::cout << a << std::endl;		// 110}
private:int a = 10;std::string s = "hello";
};int main()
{MyClass().lambdaCapture();return 0;
}

cppinsights展开:

#include <string>
#include <iostream>class MyClass
{public:inline constexpr MyClass() noexcept(false) = default;inline ~MyClass() noexcept = default;inline void lambdaCapture(){class __lambda_13_12{public:inline /*constexpr */ void operator()() const{__this->a = __this->a + 100;}private:MyClass* __this;public:__lambda_13_12(MyClass* _this): __this{ _this }{}};__lambda_13_12 f = __lambda_13_12{ this };std::cout.operator<<(this->a).operator<<(std::endl);f.operator()();std::cout.operator<<(this->a).operator<<(std::endl);}private:int a;std::basic_string<char> s;
public:
};int main()
{MyClass().lambdaCapture();return 0;
}

相关文章:

C++ lambda表达式的捕获原理

目录 C Lambda表达式捕获机制的详细原理分析Lambda的本质机制关键实现细节特殊捕获方式[ ]空捕获[&]全引用捕获[]全值(拷贝)捕获混合捕获[,&variable]拷贝及部分引用捕获[&,variable]引用及部分拷贝捕获 显式捕获[variable]拷贝捕获部分变量[&variable]引用捕获…...

修改图像分辨率

在这个教程中&#xff0c;您将学习如何使用Python和深度学习技术来调整图像的分辨率。我们将从基础的图像处理技术开始&#xff0c;逐步深入到使用预训练的深度学习模型进行图像超分辨率处理。 一、常规修改方法 1. 安装Pillow库 首先&#xff0c;你需要确保你的Python环境中…...

【面板数据】公开整理-各省刑事案件统计数据集(2011-2023年)

刑事案件数量是衡量一个地区社会治安状况的重要指标。近年来&#xff0c;我国各地在推进法治建设和社会治理现代化的背景下&#xff0c;刑事案件的数量呈现出明显的区域差异和年度波动&#xff0c;通过年度案件数据&#xff0c;可以反映出社会安全水平的变化趋势&#xff0c;为…...

ABAP使用GET_TAX_PERCENTAGE 函数取税率

ABAP使用GET_TAX_PERCENTAGE 函数取税率 今天在做含税价的时候查到的&#xff0c;记录一下。S4 Hana 的环境。 先DATA一个 ftaxp GET_TAX_PERCENTAGE 函数&#xff0c;实例为采购订单进项税。 OK&#xff0c;搞定。...

鞅与停时 - 一种特别的概率论问题

讨论一个有趣的概率问题&#xff1a; [P3334 ZJOI2013] 抛硬币 - 洛谷 实际上是一个猴子打字问题&#xff0c;考虑一直无规律随即打字的猴子&#xff0c;键盘上只有A-Z一共26个字母&#xff0c;对于一个特定的字符串 S S S &#xff1a; ABCABCAB &#xff0c;能否在有限的打…...

Android 有线网开发调试总结

Android 有线网开发调试总结 文章目录 Android 有线网开发调试总结一、前言二、有线网开发1、开关2、相关日志&#xff08;3&#xff09;相关广播&#xff08;4&#xff09;demo示例 三、其他1、Android 有线网开发调试小结2、Android13 有线网开关研究3、Android9、11 有线网络…...

.net在DB First模式使用pgsql

nuget要安装&#xff1a; Npgsql.EntityFrameworkCore.PostgreSQL Microsoft.EntityFrameworkCore.Tools vs2022-->工具-->nuget包管理器-->程序包管理器控制台-->输入命令&#xff1a; Scaffold-DbContext "Hostlocalhost;Databasemydatabase;Usernamemyu…...

Spring Boot 中如何解决 CORS 问题(详解)

在前后端分离的开发模式中&#xff0c;前端调用后端接口时&#xff0c;经常会遇到 跨域资源共享&#xff08;CORS&#xff09; 的问题。Spring Boot 作为常用的后端框架&#xff0c;提供了多种方式来优雅地解决这个问题。本文将全面介绍 Spring Boot 中处理 CORS 的常见方法、原…...

深度学习:智能车牌识别系统(python)

这是一个基于opencv的智能车牌识别系统,有GUI界面。程序能自动识别图片中的车牌号码,并支持中文和英文字符识别,支持选择本地图片文件,支持多种图片格式(jpg、jpeg、png、bmp、gif)。 下面,我将按模块功能对代码进行分段说明: 1. 导入模块部分 import tkinter as tk…...

STM32开发printf函数支持

1、printf函数支持 1、避免使用半主机模式&#xff1a;两种方法:微库法、代码法 2、实现fputc函数&#xff1a;实现单个字符输出 2、半主机模式简介 用于 ARM 目标的一种机制&#xff0c;可将来自应用程序代码的输入/输出请求传送至运行调试器的主机 简单说:就是通过仿真器实…...

解决 Chrome 与 Chromedriver 版本不一致问题的方法

目录 常见错误处理 处理方案&#xff1a; 1. 自动版本匹配方法 使用 webdriver-manager 库&#xff08;推荐&#xff09; 2. 手动版本管理方法 检查并匹配版本 3. 版本兼容性解决方案 使用兼容性表 4. 自动更新策略 定期检查更新脚本 5. Docker 容器化方案 最佳实践建…...

CPU的基本认识

为大家介绍CPU的基本概念&#xff0c;例如&#xff1a;CPU的型号认识、什么是时钟周期、物理核和逻辑核、缓存、TLB缓存的概念&#xff0c;可以帮助大家对cpu有个概念性的认识&#xff0c;选择电脑的时候可以看懂CPU的参数和理解基本原理。 CPU的基本认识 个人CPU型号介绍工作频…...

UGUI如何使用EventTrigger

前言 在 Unity 的 UGUI 系统中,EventTrigger 是一个强大的组件,允许开发者监听和处理多种 UI 交互事件。以下是详细的使用方法、示例代码、优缺点分析以及注意事项。 一、EventTrigger 基本用法 1. 添加 EventTrigger 组件 在 Unity 编辑器中选中 UI 对象(如 But…...

101alpha_第4个

(-1 * ts_rank(rank(low), 9)) 这里的low是每日的最低价。 各函数及整体含义解释 1. rank(low) 在金融分析场景里&#xff0c;low 通常代表股票在每个交易日中的最低价。rank(low) 会对一段时间内的最低价数据进行排序&#xff0c;并为每个数据赋予一个排名。比如&#xff0c;…...

5月13日观测云发布会:这一次,我们不只是发布产品

01&#xff5c;为什么举办这场发布会&#xff1f; 在生成式 AI 席卷一切、业务系统愈发复杂的时代&#xff0c;我们发现&#xff1a; 传统的监控观测已经无法满足企业对性能、安全、智能的统一诉求&#xff1b;每一个企业&#xff0c;都在经历从“看得到”到“看得懂”的跃迁&…...

【IP101】图像分割技术全解析:从传统算法到深度学习的进阶之路

图像分割详解 ✂️ 欢迎来到图像处理的"手术室"&#xff01;在这里&#xff0c;我们将学习如何像外科医生一样精准地"切割"图像。让我们一起探索这个神奇的图像"手术"世界吧&#xff01;&#x1f3e5; 目录 &#x1f4d1; 1. 图像分割简介2. 阈…...

华为设备链路聚合实验:网络工程实战指南

链路聚合就像为网络搭建 “并行高速路”&#xff0c;既能扩容带宽&#xff0c;又能保障链路冗余&#xff0c;超实用&#xff01; 一、实验拓扑速览 图中两台交换机 LSW1 和 LSW2&#xff0c;PC1、PC2 归属 VLAN 10&#xff0c;PC3 归属 VLAN 30。LSW1 与 LSW2 通过 GE0/0/1、…...

C24-数组

数组的引入:方便对同一类型的数据进行管理(一个班级里的45个同学、一个篮子里的12个苹果)数组的定义: 数据类型 数组名[常量表达式(也就是元素的个数)];int a[10]; //这里定义了一个能存放10个元素的整形数组数组初始化 完全初始化 int arr[3]{5,6,8};部分初始化 int arr[10]{…...

Vue 项目中长按保存图片功能实现指南

在移动互联网应用中&#xff0c;用户常常有保存页面特定内容为图片的需求&#xff0c;比如保存二维码、海报等。在 Vue 项目开发中&#xff0c;如何实现长按保存图片的功能&#xff1f;本文将结合具体代码&#xff0c;详细讲解在 Vue 项目中通过长按操作保存图片的技术实现与应…...

行业先锋:六款产品的实战表现

行业先锋&#xff1a;六款产品的实战表现  北京先智先行科技有限公司&#xff0c;销售着“先知大模型”、“先行AI商学院”“先知AIGC超级工场”这三个旗舰产品&#xff0c;在行业内崭露头角。旗下的先知A1、先知大模型等更是备受关注。  先知大模型&#xff0c;作为核心产…...

RS485与Profibus网关自由口数据互换技巧

RS485与Profibus网关自由口数据互换技巧 兴达易控RS485转Profibus网关在自由口模式下的数据互换&#xff0c;是工业自动化领域内一项关键的技术应用&#xff0c;它实现了不同通信协议设备之间的有效连接与数据交换。在现代工业生产中&#xff0c;众多设备和系统往往采用不同的…...

java复杂度,包装类,泛型解析

如何衡量代码的好坏&#xff1f; 评价代码的好坏我们使用算法效率来判断&#xff0c;而算法效率分两种&#xff1a; 算法效率&#xff1a; 第一种是时间效率&#xff0c;第二种是空间效率&#xff0c;时间效率被称为时间复杂度&#xff0c;⽽空间效率被称作空间复杂度。 时间…...

K8S安装部署(v1.27.6)

一、机器配置 系统版本主机名IP基于服务centos 7.9k8s-master192.168.163.104dockerk8s-node1192.168.163.105k8s-node2192.168.163.106注:以上3台机器都是2C4G的虚拟机,仅供测试使用 docker部署可以参考:docker 部署 二、其他环境配置 #1、关闭防火墙 systemctl stop fir…...

Debezium BinaryLogClient详解

Debezium BinaryLogClient详解 1. 类的作用与功能 1.1 核心作用 BinaryLogClient是Debezium中负责与MySQL服务器建立和维护Binlog连接的核心类,主要功能包括: 连接管理:建立和维护与MySQL服务器的Binlog连接事件监听:接收和处理Binlog事件心跳保活:维护连接活跃状态断线…...

Leetcode 刷题记录 09 —— 链表第三弹

本系列为笔者的 Leetcode 刷题记录&#xff0c;顺序为 Hot 100 题官方顺序&#xff0c;根据标签命名&#xff0c;记录笔者总结的做题思路&#xff0c;附部分代码解释和疑问解答&#xff0c;01~07为C语言&#xff0c;08及以后为Java语言。 01 合并 K 个升序链表 /*** Definitio…...

加速项目落地(Trae编辑器)

目录 vscode安装python支持 vscode常用插件 Trae编辑器 两个界面合成 补充&#xff08;QT开发的繁琐&#xff09; AI编程哪家强&#xff1f;Cursor、Trae深度对比&#xff0c;超详细&#xff01; - 知乎 Trae兼容vscode的插件&#xff0c;我们可以先在vscode里面装好再一…...

vue3的页面跳转方法汇总(路由跳转,组件跳转)

1.组件跳转 使用router-link组件进行组件导航&#xff08;无需引入该组件&#xff0c;可直接使用&#xff09;&#xff0c;to后面跟组件路由。如果想要在当前页显示跳转的组件&#xff0c;可以通过<router-view>来显示当前路由匹配到的组件&#xff0c;也可以不使用<r…...

C++回顾 Day5

自实现string完整版 my_string.h using namespace std; class mystr{public://mystr();mystr(const char * new_str nullptr);mystr(const mystr & another);char * c_str();~mystr();mystr& operator(const mystr & another);mystr operator(const mystr &…...

OpenMVS 的编译与运行

Title: OpenMVS 的编译与运行 文章目录 I. 编译与准备1. 获得源码2. wiki3. 退出 Conda 环境4. 编译5. 数据准备 II. 命令了解1. 稠密重建 DensifyPointCloud2. 曲面重建 ReconstructMesh3. 网格优化 RefineMesh4. 纹理贴图 TextureMesh III. 命令运行1. 运行稠密重建2. 运行网…...

@Transactional注解的使用

目录 一.介绍 1.使用Transactional注解的位置 2.Transactional注解的作用 二.举例 1.需求场景 2.做法 3.效果展示 三.简单总结 一.介绍 1.使用Transactional注解的位置 我们在Java开发中&#xff0c;一般在service层的方法上&#xff0c;使用Transactional注解&#x…...

路由器NAT回流踩坑

路由器 H3C GR-3000AX-U 不支持NAT回流 核心问题定位 外网访问 ✅ 非Docker服务&#xff08;直接运行在宿主机上的服务&#xff09;可以访问❌ Docker服务 无法访问 内网访问 ✅ 内网IP访问&#xff08;无论Docker还是非Docker&#xff09;正常❌ 内网通过公网IP访问 全部失败…...

如何创建RDD

创建RDD&#xff08;Resilient Distributed Dataset&#xff09;主要有以下三种方法&#xff1a; 1. 从集合创建RDD 通过将本地集合&#xff08;如列表、数组&#xff09;传递给SparkContext的parallelize方法&#xff0c;可以将本地数据转换为RDD。这种方式通常用于测试或开…...

PTS-G5K13M RF Generator 5kW / 13MHz 射频电源User s Manual

PTS-G5K13M RF Generator 5kW / 13MHz 射频电源User s Manual...

vue3父组件调用子组件方法

需求&#xff1a;在vue3中需要在父组件调用子组件的方法 思路&#xff1a;通过ref和defineExpose直接暴露给父组件 1.子组件暴露表单验证方法 <template><a-form ref"formRef" :model"formState" :rules"rules"><a-form-item …...

Python小酷库系列:5个常用的dict属性化访问扩展库

5个常用的dict属性化访问扩展库 嵌套结构高级功能性能综合建议 在前面我们详细讲解了 Box和 Munch这两个dict属性化访问的扩展库&#xff0c;总体而言它们主要用于提升配置文件数据、JSON对象数据的可读性&#xff0c;减少了代码中双引号。在这一领域中还有dotmap、addict 和…...

day009-用户管理专题

文章目录 1. 创建包含时间的文件2. 与用户相关的文件3. 用户分类4. 与用户相关的命令4.1 添加用户4.2 删除用户4.3 查看用户4.4 修改用户密码 5. sudo6. 思维导图7. 老男孩思想-学习方法 1. 创建包含时间的文件 或$()是替换符号&#xff0c;可以将命令的结果作为字符串或变量的…...

微信小程序pinia的应用

情景&#xff1a;院校列表的关注状态的实时更新 新建一个ts文件存储关注状态&#xff0c;用于集中管理用户“已关注院校”的相关状态和操作 import {definStore} from pinia; import type { College_records } from /types/university;export const useFocusCollegeStore de…...

LWIP的超时事件笔记

那个马蜂佬&#xff0c;刚发就给我两个赞 lwIP超时事件处理简介 为每个与外界网络连接的任务都设定了timeout属性&#xff0c;即等待超时时间&#xff0c;例如TCP建立连接超时、ARP缓存表项的时间管理等&#xff0c;都需要超时操作来处理 lwIP超时事件机制 一共有四种 2.1&a…...

如何避免项目结束后知识流失

避免项目结束后知识流失的方法包括&#xff1a;建立项目知识库、实施定期知识回顾与总结、强化团队内部知识共享机制、利用合适的知识管理工具。项目知识库的建设尤其关键&#xff0c;它可帮助团队保留核心经验和方法&#xff0c;确保知识沉淀在组织内部。通过知识库&#xff0…...

【MCP】客户端配置(ollama安装、qwen2.5:0.5b模型安装、cherry-studio安装配置)

【MCP】客户端配置&#xff08;ollama安装、qwen2.5:0.5b模型安装、cherry-studio安装配置&#xff09; 客户端配置&#xff08;1&#xff09;下载安装ollama&#xff08;2&#xff09;安装qwen2.5:0.5b模型&#xff08;3&#xff09;安装配置cherry-studio 客户端配置 &#…...

Media3 中 Window 的时间相关属性详解

AndroidX Media3 的 Timeline.Window 类中&#xff0c;与时间相关的属性描述了媒体播放窗口&#xff08;window&#xff09;在时间维度上的关键信息。这些属性帮助开发者理解媒体的播放范围、起始点、持续时间以及与设备时间或直播流的同步关系。 Timeline.Window 的时间相关属…...

C 语言编码规范

在 C 语言开发过程中&#xff0c;遵循编码规范不仅能提高代码的可读性、可维护性&#xff0c;还能减少潜在的错误&#xff0c;提升团队协作效率。以下从多个维度详细阐述 C 语言编码过程中需要注意的规范要点。 一、命名规范 变量命名 变量命名应做到见名知意&#xff0c;采用…...

嵌入式开发学习日志Day15

一、指针指向字符型数组 &#xff08;1&#xff09;【const】&#xff1a;在指针变量中使用时&#xff0c;无法通过该指针修改被指向的变量&#xff1b; &#xff08;2&#xff09;【const】&#xff1a;关键字&#xff0c;在C和C中&#xff0c;能加就加&#xff0c;加了一定…...

从人脸扫描到实时驱动,超写实数字分身技术解析

在元宇宙浪潮中&#xff0c;数字人、虚拟数字人等新兴概念逐渐走进大众视野&#xff0c;其中数字分身作为虚拟数字人的细分领域&#xff0c;正引发广泛关注。数字分身依托人工智能与虚拟现实技术&#xff0c;能基于真人信息进行1:1复刻&#xff0c;具备与真人高度相似的外貌、声…...

Vue3 自定义指令的原理,以及应用

文章目录 前言一、原理说明二、注册与使用1. 全局注册2. 局部注册3. 使用方式 三、典型应用场景四、案例&#xff1a;权限控制指令五、注意事项 v-draggable✅ 目标效果&#xff1a;&#x1f9e9; 1. 自定义指令定义&#x1f9f1; 2. 在项目中注册&#x1f9ea; 3. 使用示例&am…...

306.检查是否所有A都在B之前

2124. 检查是否所有 A 都在 B 之前 - 力扣&#xff08;LeetCode&#xff09; class Solution {public boolean checkString(String s) {return !s.contains("ba");} } class Solution(object):def checkString(self, s):return s.find("ba")-1...

适合java程序员的Kafka消息中间件实战

创作的初心&#xff1a; 我们在学习kafka时&#xff0c;都是基于大数据的开发而进行的讲解&#xff0c;这篇文章为java程序员为核心&#xff0c;助力大家掌握kafka实现。 什么是kafka: 历史&#xff1a; 诞生与开源&#xff08;2010 - 2011 年&#xff09; 2010 年&#xf…...

当体育数据API遇上WebSocket:一场技术互补的「攻防战」

在世界杯决赛的最后一分钟&#xff0c;你正通过手机观看直播。突然&#xff0c;解说员大喊“球进了&#xff01;”&#xff0c;但你的屏幕却卡在对方半场的回放画面——这种「延迟乌龙」的尴尬&#xff0c;正是实时体育应用面临的终极挑战。 在体育数字化浪潮下&#xff0c;用…...

1:点云处理—三种显示方法(自建点云)

1.彩色显示 *读取三维点云 dev_get_window(WindowHandle)dev_open_window(0, 0, 512, 512, black, WindowHandle1) read_object_model_3d(./19-12-26/t.ply, m, [], [], ObjectModel3D, Status)Instructions[0] : Rotate: Left button Instructions[1] : Zoom: Shift left…...

SCADA|KingSCADA运行报错:加载实时库服务失败

哈喽,你好啊,我是雷工! 最近在绵阳出差,在现场调试时遇到报错问题,翻了下以往记录没有该错误的相关笔记。 于是将问题过程及处理办法记录下来。 01 问题描述 昨天还好好的,可以正常运行的程序今天再次运行时报错: “加载 实时库服务 失败” 查看日志中错误信息如下: …...