目录

一、引用的概念

二、引用的特性

1、定义时必须初始化

2、一个变量可以有多个引用

3、引用一旦绑定实体就不能更改

三、const引用(常引用)

1、const引用的基本特性

2、临时对象与const引用

3、临时对象的特性

4、const 引用作为函数形参

1. 基本示例(类型不匹配时创建临时对象)

2. 数值类型转换(临时对象存储转换后的值)

3. 如果形参是 非 const 引用,则不允许绑定临时对象

4. 类对象的隐式转换(临时对象 + const 引用)

总结

四、引用的使用场景

1、引用作为函数参数

引用传参的工程价值

2、引用作为函数返回值

返回引用最佳实践

注意:

五、引用与指针的区别(超重要!!!)

引用与指针的工程选择准则

C++引用与其他语言引用的本质区别

关键差异点

六、引用的优点

七、数据结构中的引用实践

1、C风格二级指针实现解析

关键点解析

调用方式

2、C++引用风格实现解析

关键改进

调用方式

3、两种实现的底层对比

内存布局示例

八、现代C++中的引用演进(后面会学到,现在先了解)

1、右值引用(C++11引入)

2、完美转发

3、结构化绑定(C++17)

九、引用使用的注意事项

1、避免悬垂引用

2、接口设计原则

3、多线程环境


一、引用的概念

        引用(Reference)是C++中一种重要的复合类型,它不是定义一个新的变量,而是为已存在的变量提供一个别名。编译器不会为引用变量单独分配内存空间,引用变量与其引用的实体共享同一块内存空间。

        C++中为了避免引入太多的运算符,会复用C语言的一些符号,比如前面的>>和<<,这里引用也和取地址使用了同⼀个符号&,大家注意使用方法角度区分就可以。(吐槽一下,这个问题其实挺坑的,个人觉得用更多符号反而更好,不容易混淆)

基本语法形式:

类型& 引用变量名 = 引用实体;

重要说明引用类型必须与引用实体是同种类型。 

示例代码:

#include <iostream>
using namespace std;int main() {int a = 10;int& b = a;  // 给变量a取一个别名bcout << "a = " << a << endl;  // 输出10cout << "b = " << b << endl;  // 输出10b = 20;  // 通过引用修改变量值cout << "a = " << a << endl;  // 输出20cout << "b = " << b << endl;  // 输出20return 0;
}


二、引用的特性

1、定义时必须初始化

  • 引用必须在声明时进行初始化,不能先声明后赋值

  • 正确示例:

    int a = 10;
    int& b = a;  // 正确:定义时初始化
  • 错误示例:

    int c = 10;
    int &d;     // 错误:未初始化
    d = c;

2、一个变量可以有多个引用

int a = 10;
int& b = a;
int& c = a;
int& d = a;

此时,b、c、d都是变量a的别名。

3、引用一旦绑定实体就不能更改

  • 引用在初始化后不能改为指向其他实体

  • 示例:

    int a = 10;
    int& b = a;
    int c = 20;
    b = c;  // 这不是改变引用指向,而是将a的值改为20

三、const引用(常引用)

        上面提到,引用类型必须和引用实体是同种类型的。但是仅仅是同种类型,还不能保证能够引用成功,我们若用一个普通引用类型去引用其对应的类型,但该类型被const所修饰,那么引用将不会成功。

常引用(const reference)用于引用常量或临时对象,具有以下特点:

  1. 可以引用常量

  2. 可以延长临时对象的生命周期

  3. 不能通过常引用修改被引用的对象

示例:

int main() {const int a = 10;// int& ra = a;    // 错误:不能用普通引用引用常量const int& ra = a;  // 正确// int& b = 10;    // 错误:不能引用字面常量const int& b = 10;  // 正确double pi = 3.14159;// int& rpi = pi;  // 错误:类型不匹配const int& rpi = pi; // 正确:会发生隐式转换return 0;
}

        我们可以将被const修饰了的类型理解为安全的类型,因为其不能被修改。我们若将一个安全的类型交给一个不安全的类型(可被修改),那么将不会成功。 

1、const引用的基本特性

const引用是C++中一种特殊的引用类型,具有以下重要特性:

  1. 引用const对象:必须使用const引用来引用const对象

    const int a = 10;
    const int& ra = a;  // 正确
    int& rb = a;       // 错误:不能使用非const引用引用const对象,这是权限的放大
  2. 引用普通对象:const引用可以引用普通对象,这是权限的缩小

    int b = 20;
    const int& rb = b;  // 正确:权限缩小
  3. 权限规则

    • 权限可以缩小(从可修改到只读)

    • 但不能放大(从只读到可修改)

2、临时对象与const引用

        C++中有几种常见情况会产生临时对象(以下各点都同理):临时对象具有常性!!!(重要!!!)

  1. 表达式结果

    int a = 5;
    const int& rb = a * 3;  // 正确:a*3的结果存储在临时对象中
    int& rc = a * 3;       // 错误:临时对象具有常性

  2. 类型转换

    double d = 12.34;
    const int& rd = d;     // 正确:类型转换产生临时int对象
    int& re = d;          // 错误:临时对象具有常性

3、临时对象的特性

        临时对象(temporary object)是编译器在需要暂存表达式求值结果时自动创建的未命名对象,具有以下特点:

  1. 常性:临时对象默认具有const属性(常性)

    int a = 5;
    const int& r1 = a * 2;  // 正确:临时对象具有常性,可以用 const 引用绑定
    int& r2 = a * 2;        // 错误:临时对象是 const 的,不能绑定非 const 引用
  2. 生命周期临时对象通常会在表达式结束时销毁,但如果绑定到 const 引用,其生命周期会延长至该引用的作用域结束。

    #include <iostream>int main() {// 临时int直接使用 - 表达式结束就"消失"std::cout << "临时int值: " << 42 << std::endl;// 绑定到const引用 - 生命周期延长const int& ref = 123;  // 临时123会一直存在直到main结束std::cout << "通过引用访问: " << ref << std::endl;return 0;
    }

    说明:第一个42是纯临时值,用完即"消失";第二个123因为绑定到const引用ref,所以会一直存在直到main函数结束

  3. 隐式创建编译器自动生成临时对象的情况:(超重要!!!)

    • 表达式求值结果

      int x = 10, y = 20;
      const int& sum = x + y;  // x + y 的结果存储在临时对象中

      当表达式的结果需要存储时,编译器会生成临时对象。

    • 类型转换中间结果

      double d = 3.14;
      const int& intVal = d;  // 生成临时 int 对象存储截断后的值(3)

      当隐式类型转换发生时,编译器会生成临时对象存储转换后的值。

    • 函数返回值(未使用移动语义时)

      std::string createString() {return "Temporary";  // 返回临时对象
      }int main() {const std::string& s = createString();  // 临时对象的生命周期延长std::cout << s << std::endl;  // 正确:"Temporary"return 0;
      }

      当函数返回一个临时对象时,如果没有优化(如 RVO/NRVO),编译器会生成临时对象。

4、const 引用作为函数形参

        当 const 引用作为函数形参 时,如果传入的实参类型不匹配(但可以隐式转换),编译器会自动创建临时对象来存储转换后的值,并让 const 引用绑定到这个临时对象。(学到后面再回看)

1. 基本示例(类型不匹配时创建临时对象)

void print(const std::string& str) {std::cout << str << std::endl;
}int main() {print("Hello");  // "Hello" 是 const char[6],编译器生成临时 std::string 对象return 0;
}

发生了什么?

  1. "Hello" 的类型是 const char[6],而 print 的参数是 const std::string&

  2. 编译器隐式调用 std::string 的构造函数,生成一个临时 std::string 对象。

  3. const std::string& str 绑定到这个临时对象,临时对象的生命周期延长至 print 函数结束

2. 数值类型转换(临时对象存储转换后的值)

void printInt(const int& num) {std::cout << num << std::endl;
}int main() {double d = 3.14;printInt(d);  // 生成临时 int 对象存储截断后的值(3)return 0;
}

发生了什么?

  1. d 是 double 类型,而 printInt 的参数是 const int&

  2. 编译器生成一个临时 int 对象,存储 d 截断后的值(3)。

  3. const int& num 绑定到这个临时 int 对象。

3. 如果形参是 非 const 引用,则不允许绑定临时对象

void modify(int& num) {  // 非 const 引用num = 100;
}int main() {modify(42);  // 错误!临时对象不能绑定到非 const 引用return 0;
}

为什么不行?

  • 生成临时对象,但是它不能绑定到非const引用中。

  • 临时对象是 const 的,不能通过 非 const 引用 修改。

  • C++ 禁止这种行为,避免逻辑错误(修改一个即将销毁的临时对象没有意义)。

4. 类对象的隐式转换(临时对象 + const 引用)

class MyString {
public:MyString(const char* s) { std::cout << "构造临时 MyString\n"; }
};void printStr(const MyString& s) {std::cout << "使用 MyString\n";
}int main() {printStr("Hello");  // 生成临时 MyString 对象return 0;
}

输出:

说明:

  • "Hello" 触发 MyString 的构造函数,生成临时对象。

  • const MyString& s 绑定到这个临时对象,生命周期延长至 printStr 结束。

总结

情况是否生成临时对象?是否合法?
const T& 形参 + 可隐式转换的实参✔️ 生成✔️ 合法
const T& 形参 + 完全匹配的实参❌ 不生成✔️ 合法
T& 形参(非 const 引用) + 临时对象✔️ 生成❌ 非法

关键点:

  1. const 引用可以延长临时对象的生命周期,避免悬垂引用。

  2. 非 const 引用不能绑定临时对象,因为临时对象是只读的。

  3. 这种机制使得 const 引用在接受字面量、表达式结果、类型转换结果时更加灵活和安全。

这在 C++ 的函数参数传递、返回值优化(RVO)、隐式转换等场景中非常重要!


四、引用的使用场景

1、引用作为函数参数

引用作为函数参数可以实现高效传参,避免拷贝开销,同时可以修改实参的值。

示例(交换函数)

        还记得C语言中的交换函数,学习C语言的时候经常用交换函数来说明传值和传址的区别。现在我们学习了引用,可以不用指针作为形参了:

void Swap(int& a, int& b) {int tmp = a;a = b;b = tmp;
}

因为在这里a和b是传入实参的引用,我们将a和b的值交换,就相当于将传入的两个实参交换了。 

引用传参的工程价值

引用传参在C++中主要有两大优势:

  1. 性能优化:避免大型对象拷贝带来的性能损耗

  2. 语义明确:通过引用明确表达函数可能修改参数值的意图

// 性能敏感场景:传递大型结构体
void ProcessLargeData(const BigData& data) {  // const引用避免拷贝// 只读操作...
}// 需要修改参数的场景
void TransformData(Matrix& matrix) {  // 非const引用表明会修改参数matrix.invert();
}

2、引用作为函数返回值

引用可以作为函数返回值,但需要注意:

  • 不能返回局部变量的引用(除非是static局部变量)(因为在函数内部定义的普通的局部变量会随着函数调用的结束而被销毁)

  • 可以返回类成员变量、全局变量或动态分配内存的引用(不会随着函数调用的结束而被销毁的数据)

  • 可以返回函数参数中的引用

引用返回值的使用需要特别注意生命周期管理:

// 安全示例:返回静态变量或成员变量的引用
int& GetStaticValue() {static int value = 0;  // 静态变量生命周期与程序相同return value;
}// 危险示例:返回局部变量的引用
int& DangerousFunction() {int local = 42;       // 局部变量将在函数返回后被销毁return local;         // 编译器警告:返回局部变量的引用
}

返回引用最佳实践

  1. 返回对象成员变量时

  2. 返回函数内静态变量时

  3. 返回动态分配的对象时(需配合智能指针)

  4. 返回参数中传入的引用时

注意:

        如果函数返回时,出了函数作用域,返回对象还未还给系统,则可以使用引用返回;如果已经还给系统了,则必须使用传值返回。 


五、引用与指针的区别(超重要!!!)

        在C++中,指针和引用就像一对性格迥异的孪生兄弟。指针如同大哥,引用则像小弟,二者在实践中相得益彰。虽然功能有所重叠,但各自拥有独特的特点,彼此不可替代。

虽然引用在底层实现上通常是通过指针实现的,但在语法和使用上有显著区别:

特性引用指针
开辟内存空间不开辟内存空间(引用只是一个变量的取别名)要开辟内存空间(指针存储一个变量的地址)
初始化要求必须初始化可以不初始化
可修改性一旦绑定实体就不能更改可以随时改变指向
NULL值不能为NULL可以为NULL
sizeof结果引用类型的大小指针的大小始终是地址空间所占字节个数(32位平台下占4个字节,64位下是8byte)
自增操作实体值增加1指向下一个同类型对象
多级间接访问不支持多级引用支持多级指针
访问方式自动解引用需要显式解引用
安全性更高(引用很少出现空指针和野指针的问题)相对较低(指针很容易出现空指针和野指针的问题)

在语法概念上,引用就是一个别名,没有独立的空间,其和引用实体共用同一块空间。 

int main() {int a = 10;int& ra = a;    // 底层通常实现为指针ra = 20;       // 自动解引用int* pa = &a;   // 显式指针*pa = 20;      // 显式解引用return 0;
}

但是在底层实现上,引用实际是有空间的,底层实现示例(汇编层面):

从汇编角度来看,引用的底层实现也是类似指针存地址的方式来处理的。 

引用与指针的工程选择准则

场景推荐选择理由
必须重新绑定指针引用一旦绑定不可更改
可能为nullptr指针引用不能为null
容器存储指针引用不是对象,不能直接存储
函数参数常引用优先更清晰的语义,更安全的const保证
操作符重载引用更自然的语法
多态操作指针或引用根据是否需要重新绑定决定

C++引用与其他语言引用的本质区别

// C++引用示例
int a = 10;
int& ref = a;  // 永久绑定到a
int b = 20;
// ref = b;    // 不是重新绑定,而是赋值操作
// Java"引用"示例
Integer a = new Integer(10);
Integer ref = a;  // 可以重新指向其他对象
Integer b = new Integer(20);
ref = b;         // 合法操作,ref现在指向b
关键差异点
  1. 绑定灵活性:C++引用是永久绑定,Java引用可重新指向

  2. 空值处理:C++引用不能为null,Java引用可以为null

  3. 内存管理:C++引用不涉及内存管理,Java引用与GC机制紧密相关


六、引用的优点

  1. 更清晰的语法:引用使代码更易读,避免了指针的复杂语法

  2. 更安全:引用必须初始化且不能为NULL,减少了空指针风险

  3. 更高效:避免了值传递的拷贝开销

  4. 支持运算符重载:使自定义类型的运算符重载更自然


七、数据结构中的引用实践

        在部分采用C代码实现的数据结构教材中,作者会使用C++的引用替代指针传参来简化程序,避免复杂的指针操作。但由于许多学生尚未掌握引用这一概念,反而增加了理解难度。

在传统C风格数据结构改造中,同时引用也可以显著提升代码可读性,例子如下:

1、C风格二级指针实现解析

在传统C语言中,由于没有引用概念,修改链表头指针需要使用二级指针:

// 节点结构定义
typedef struct Node {int value;struct Node* next;
} Node;// 创建新节点
Node* createNode(int value) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->value = value;newNode->next = nullptr;return newNode;
}// 在链表头部插入节点
void insertNode(Node** head, int value) {Node* newNode = createNode(value);newNode->next = *head;  // 新节点指向原头节点*head = newNode;        // 修改头指针指向新节点
}

关键点解析

  1. 二级指针的必要性:为了修改调用方的头指针,需要传递指针的地址

  2. 解引用操作:通过*head访问实际的头指针

  3. 操作顺序:必须先设置新节点的next指针,再更新头指针

调用方式

Node* head = nullptr;  // 空链表
insertNode(&head, 10); // 必须传递头指针的地址
insertNode(&head, 20);

2、C++引用风格实现解析

C++引用提供了更直观的语法来修改指针:

struct Node {int value;Node* next;
};Node* createNode(int value) {Node* newNode = new Node;newNode->value = value;newNode->next = nullptr;return newNode;
}// 使用引用简化链表操作
void insertNode(Node*& head, int value) {Node* newNode = createNode(value);newNode->next = head;  // 直接使用head引用head = newNode;        // 直接修改head引用
}

关键改进

  1. 语法简化Node*&表示对指针的引用,无需二级指针

  2. 直观操作直接操作head就像操作原始指针一样

  3. 类型安全引用必须初始化,避免了空指针风险

调用方式

Node* head = nullptr;  // 空链表
insertNode(head, 10);  // 直接传递指针,无需取地址
insertNode(head, 20);

3、两种实现的底层对比

内存布局示例

调用方:[head指针] -> [节点A] -> [节点B] -> nullptr

C风格:调用栈保存head指针的地址,然后函数内通过解引用修改head指针

C++风格:调用栈保存head指针的引用(编译器通常用指针实现),然后函数内直接操作引用


八、现代C++中的引用演进(后面会学到,现在先了解)

1、右值引用(C++11引入)

void process(std::string&& str) {  // 移动语义支持// 可以安全"窃取"str的资源
}

2、完美转发

template<typename T>
void relay(T&& arg) {  // 通用引用process(std::forward<T>(arg));  // 保持值类别
}

3、结构化绑定(C++17)

std::map<int, std::string> m;
for (auto& [key, value] : m) {  // 引用绑定到map元素// 直接修改map中的值
}

九、引用使用的注意事项

1、避免悬垂引用

  • 不要返回局部变量的引用

  • 不要返回临时对象的引用

  • 注意lambda捕获引用时的生命周期

2、接口设计原则

  • 输入参数:const引用优先

  • 输出参数:非const引用明确修改意图

  • 返回值:值返回优先,必要时返回引用

3、多线程环境

  • 共享数据的引用访问需要同步

  • 避免跨线程传递局部变量的引用

        引用作为C++的核心特性,其正确使用需要开发者深入理解其语义和限制。在性能关键代码中合理使用引用,可以显著提升程序效率,同时保持代码的清晰性和安全性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/94115.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/94115.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/94115.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大语言模型API付费?

下面是目前主流 大语言模型 API 的付费情况总览&#xff1a; &#x1f9e0; 一、主要大语言模型 API&#xff1a;是否付费对比 提供方模型是否免费限制 / 说明OpenAIGPT-3.5 / GPT-4 / GPT-4o❌ 付费为主有免费额度&#xff08;如 ChatGPT 免费版&#xff09;&#xff0c;API …

巧用Wisdom SSH:容器化运维与传统运维的抉择

巧用Wisdom SSH&#xff1a;容器化运维与传统运维的抉择 在当下的技术领域&#xff0c;容器化运维与传统运维是运维人员面临的两大主要方向&#xff0c;对于从业者来说&#xff0c;如何抉择至关重要&#xff0c;而Wisdom SSH在其中能发挥显著作用。 传统运维&#xff1a;基石…

API征服者:Python抓取星链卫星实时轨迹

API征服者&#xff1a;Python抓取星链卫星实时轨迹从基础调用到工业级卫星追踪系统实战指南一、太空数据时代&#xff1a;星链卫星的全球覆盖​​星链卫星网络规模​​&#xff1a;已发射卫星数量&#xff1a;4,000目标卫星总数&#xff1a;42,000轨道高度&#xff1a;340km - …

《深潜React列表渲染:调和算法与虚拟DOM Diff的优化深解》

当用户在内容平台无限滑动&#xff0c;或是在管理系统中处理成百上千条数据时&#xff0c;每一次无卡顿的交互&#xff0c;都是调和算法与虚拟DOM Diff机制协同工作的成果。理解这两者的底层逻辑&#xff0c;不仅是性能优化的钥匙&#xff0c;更是从“使用框架”到“理解框架”…

自动化与配置管理工具 ——Ansible

一、Ansible 概述1.1 核心特性Ansible 是一款开源的自动化运维工具&#xff0c;采用无代理&#xff08;Agentless&#xff09;架构&#xff0c;通过 SSH 协议实现对远程节点的管理。其核心特性包括&#xff1a;无代理架构&#xff1a;被管理节点无需安装代理软件&#xff0c;降…

Effective C++ 条款18:让接口容易被正确使用,不易被误用

Effective C 条款18&#xff1a;让接口容易被正确使用&#xff0c;不易被误用核心思想&#xff1a;设计接口时&#xff0c;应使正确使用方式直观自然&#xff0c;同时通过类型系统、行为约束等手段主动预防常见错误&#xff0c;减少用户犯错的可能性。 ⚠️ 1. 接口误用的常见陷…

nodejs读写文件

1.读文件 node有很多模块&#xff0c;可在node模块查看相应模块&#xff1b; var fsrequire(fs)fs.readFile(./src/a.doc,utf8,function(err,data){// 如果发生错误&#xff0c;data是undefined 如果成功 err为null console.log(err); console.log(data); }) 2.写文件 var…

ConcurrentHashMapRedis实现二级缓存

1. 为什么使用ConcurrentHashMap&#xff1f;在Java中&#xff0c;ConcurrentHashMap 是一个线程安全且高效的哈希表实现&#xff0c;广泛用于高并发场景。将其用作一级缓存的原因主要包括以下几点&#xff1a;1.1. 线程安全性ConcurrentHashMap 是线程安全的&#xff0c;支持多…

Mysql集群技术

实验在RHEL7中做&#xff0c;因为9中缺少了一个关键的高可用组件环境&#xff1a;两台数据库&#xff0c;内存和CPU要多一点主流是MYSQL&#xff08;开源&#xff09;&#xff0c;Oracle收费较贵RHEL7中直接用make编译是有问题的&#xff0c;所以需要要gcc工具做好前置准备&…

自动驾驶嵌入式软件工程师面试题【持续更新】

文章目录前言请描述 CAN 帧的基本结构&#xff08;包括标识符、数据字段、CRC 等&#xff09;描述 WebSocket 协议的基本工作流程&#xff08;包括握手、数据帧结构&#xff09;请说明如何实现 WebSocket 连接的心跳机制以检测连接状态&#xff0c;并描述在断开后如何通过重连策…

vue(5)-组件

一.组件三大组成部分&#xff08;结构/样式/逻辑&#xff09;&#xff08;1&#xff09;组件样式冲突用scoped全局样式在组件中起全局作用&#xff0c;局部样式可以加scoped属性来只作用于当前组件图中只给baseone加这个样式&#xff0c;就在baseone中style加scoped&#xff08…

【机器学习】两大线性分类算法:逻辑回归与线性判别分析:找到分界线的艺术

文章目录一、核心概念&#xff1a;数据分类的"切分线"二、工作原理&#xff1a;从"找分界线"理解二、常见算法1、逻辑回归&#xff1a;二分类2、线性判别分析&#xff08;LDA&#xff09;&#xff1a;分类与降维3、两种算法对比分析三、实际应用&#xff1…

静态分析c/cpp源码函数调用关系图生成

calltree calltree 不好使用 Dpxygen https://www.doxygen.nl/download.html Graphviz https://graphviz.org/download/ 静态代码调用结构图分析、构建、生成 doxygen doxygen在win和linux上均可运行&#xff0c;可以自动分析源码&#xff0c;对c语言项目友好&#xff0c;预处…

使用 MySQL Shell 进行 MySQL 单机到 InnoDB Cluster 的数据迁移实践

迁移背景与环境原来都是用mysqldump&#xff0c;DTS或者cdc迁移&#xff0c;这次8.0用了下新工具感觉挺好用的&#xff0c;简单快捷&#xff0c;30G数据不到源环境&#xff1a;单机 MySQL 8.0&#xff0c;地址为 172.23.3.28目标环境&#xff1a;InnoDB Cluster 集群&#xff0…

淘宝商品API可以获取哪些商品详情数据?

商品详情页商品全部sku信息"skus": {"sku": [{"price": 45.6,"total_price": 0,"orginal_price": 45.6,"properties": "1627207:39617249736","properties_name": "1627207:39617249736…

新一代PLC控制软件平台EsDA-AWStudio

在工业自动化和智能制造领域&#xff0c;高效的软件平台是提升开发效率和系统性能的关键。ZLG致远电子推出的EsDA-AWStudio平台&#xff0c;凭借其强大的功能和灵活的设计&#xff0c;为工业控制和物联网应用提供了全新的解决方案。一站式PLC工业控制软件平台EsDA-AWStudioZLG致…

基于深度学习的医学图像分析:使用MobileNet实现医学图像分类

前言 医学图像分析是计算机视觉领域中的一个重要应用&#xff0c;特别是在医学图像分类任务中&#xff0c;深度学习技术已经取得了显著的进展。医学图像分类是指将医学图像分配到预定义的类别中&#xff0c;这对于疾病的早期诊断和治疗具有重要意义。近年来&#xff0c;MobileN…

docker 容器常用命令

在平常的开发工作中&#xff0c;我们经常需要使用 docker 容器&#xff0c;那么常用的 docker 容器命令有哪些呢&#xff1f;今天简单总结下。 一&#xff1a;查看容器查看运行的容器&#xff1a;docker ps查看所有的容器&#xff1a;docker ps a查看容器详细信息&#…

重型机械作业误伤预警响应时间缩短80%!陌讯多模态识别算法在工程现场的应用优化

一、行业痛点&#xff1a;机械作业场景的识别困境据《工程机械安全白皮书&#xff08;2025&#xff09;》统计&#xff0c;施工现场因机械盲区导致的工伤事故中​​78.3%由识别延迟引发​​。核心难点包括&#xff1a;​​动态遮挡问题​​&#xff1a;吊臂摆动导致目标部件部分…

2025年ESWA SCI1区TOP,强化学习多目标灰狼算法MOGWO-RL+分布式混合流水车间调度,深度解析+性能实测

目录1.摘要2.问题描述和数学建模3.强化学习多目标灰狼算法MOGWO-RL4.结果展示5.参考文献6.算法辅导应用定制读者交流1.摘要 本文针对大规模个性化制造&#xff08;MPM&#xff09;中的调度问题&#xff0c;提出了一种新的解决方案。MPM能够在确保大规模生产的前提下&#xff0…