C++入门基础知识1
今天,我们正式来学习C++,由于C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等。熟悉C语言之后,对C++学习有一定的帮助。
现在我们这篇主要是:
1. 补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的,比如:作用
域方面、IO方面、函数方面、指针方面、宏方面等。
2. 为后续类和对象学习打基础。
首先学习C++,肯定是先了解了解是谁创建了C++吧,谁是C++之父呢?
1979年,贝尔实验室的本贾尼等人试图分析unix内核的时候,试图将内核模块化,于是在C语言的基础上进行扩展,增加了类的机制,完成了一个可以运行的预处理程序,称之为C with classes。
一:C++关键字
它比c语言增加了好多,这里的具体就先不讲解先,后面会一一了解。

二:命名空间定义
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的
#include <stdio.h>
#include <stdlib.h>
int rand = 10;int main()
{
printf("%d\n", rand);
return 0;
}编译后后报错:error C2365: “rand”: 重定义;以前的定义是“函数”
以上面为了,在c语言中,会出现冲突问题。因为rand在库函数里已经定义了为随机值的关键词。所以不能再使用这来做变量名。所以C++ 为了避免这种情况,,设置了namespace
命名空间的定义:
怎么使用它呢?
namespace +(命名空间的名字)
{}
eg:比如我就以bai作为命名空间(可以使用你喜欢的名字eg:名字缩写等等)这样的话就
1. 命名空间中可以定义变量/函数/类型
namespace bai
{变量int rand = 10;函数int Add(int left, int right){return left + right;}类型struct Node{struct Node* next;int val;}
}int main()
{printf("%d",rand);return 0;
}
2. 命名空间可以嵌套
//"test.cpp"文件中
namespace N1
{int a;int b;int Add(int left, int right){return left + right;}namespace N2{int c;int d;int Sub(int left, int right){return left - right;}}}
3.同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
//"test.h"文件中
namespace N1
{
int Mul(int left, int right)
{
return left * right;
}
}
一个工程中的test.h和上面test.cpp中两个N1会被合并成一个
使用方法:
三种方法:
1.加命名空间名称及作用域限定符::
2.使用using将命名空间中某个成员引入
注意:这里不可以用using::rand,会出现:
原因:我们可以把using理解为展开的意思,如果你用了using bai::rand,相当于把rand放到了全局变量中,这和#include<stddlib.h>头文件的定义的rand冲突,所以会失败。
3.使用using namespace 命名空间名称 引入
注意:这样弄的话,还是里面不能有与关键词冲突的变量,理由如上
三: C++输入&输出
初见C++,我们就先以跟初见C语言时的见面方式问候大家吧。
#include<iostream>
// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
using namespace std;
int main()
{
cout<<"Hello world!!!"<<endl;
return 0;
}
说明:
1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件,以及按命名空间使用方法使用std。
2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包<iostream>头文件中。
3. <<是流插入运算符,>>是流提取运算符。
4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。C++的输入输出可以自动识别变量类型。
5. 实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及运算符重载等知识,
这些知识我们我们后续才会学习,所以我们这里只是简单学习他们的使用。
#include <iostream>
using namespace std;
int main()
{
int a;
double b;
char c;
// 可以自动识别变量的类型
cin>>a;
cin>>b>>c;
cout<<a<<endl;
cout<<b<<" "<<c<<endl;
return 0;
}
但是,需要注意的是,
std命名空间的使用惯例:std是C++标准库的命名空间,如何展开std使用更合理呢?
1. 在日常练习中,建议直接using namespace std即可,这样就很方便。
2. using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对
象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模
大,就很容易出现。所以建议在项目开发中使用,像std::cout这样使用时
指定命名空间 +using std::cout展开常用的库对象/类型等方式
四. 缺省参数
1.概念:
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。

2.分类:
全缺省参数:

半缺省参数:

注意:
1. 半缺省参数必须从右往左依次来给出,不能间隔着给
2. 缺省参数不能在函数声明和定义中同时出现
//a.h void Func(int a = 10); // a.cpp void Func(int a = 20) {}原因:如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值
3. 缺省值必须是常量或者全局变量
4. C语言不支持(编译器不支持)
五. 函数重载
这里有一个很好理解的具象化的玩笑儿。
国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个是男足。前者是“谁也赢不了!”,后者是“谁也赢不了!
那么,函数重载也是差不多的理解,可以认为它也是有多层意思。
概念:
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。
现在我们来分别理解一下:参数个数 或 类型 或 类型顺序不同的几种情况
1.类型不同

2.参数个数不同

3.类型顺序不同:
为什么C++支持函数重载,而C语言不支持函数重载呢?
在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接。

c语言预处理知识点笔记-CSDN博客
这里之前有讲解过相关预处理的知识点。我们可以先回顾回顾。

1. 实际项目通常是由多个头文件和多个源文件构成,而通过C语言阶段学习的编译链接,我们可以知道,【当前a.cpp中调用了b.cpp中定义的sum函数时】,编译后链接前,a.o的目标
文件中没有sum的函数地址,因为sum是在b.cpp中定义的,所以sum的地址在b.o中。那么
怎么办呢?
2. 所以链接阶段就是专门处理这种问题,链接器看到a.o调用sum,但是没有sum的地址,就
会到b.o的符号表中找sum的地址,然后链接到一起。
3. 那么链接时,面对sum函数,链接接器会使用哪个名字去找呢?这里每个编译器都有自己的函数名修饰规则。
4.这里使用Linux来解答,(后续一段时间学到了之后会更新),现在就简单来认识认识。
5. 通过下面我们可以看出gcc(C语言)的函数修饰后名字不变。而g++(C++)的函数修饰后变成【_Z+函数长度+函数名+类型首字母】
C语言
C++:
因此:在linux下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参数类型信息添加到修改后的名字中
C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。
7.如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办法区分
六: 引用
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间
简单来说,你可以理解为,引用就是现实生活中的外号,如:水浒传当中:宋江又称为及时雨,那么及时雨就相当于引用(别名);
用法:
类型& 引用变量名(对象名) = 引用实体;
注意:引用类型必须和引用实体是同种类型的
由上图我们也是可以看到:它们都是用同一个地址的,说明没有开辟新空间。
特点:
1. 引用在定义时必须初始化
2. 一个变量可以有多个引用
3. 引用一旦引用一个实体,再不能引用其他实体
这里引用可以替换之前我们写交换的函数:
void Swap(int* x1,int* x2)
{int temp=*x1;*x1=*x2;*x2=temp;
}
之前写这个时,在我们使用时是不是还要&取地址, 但是现在我们改一下:
void Swap(int& x1,int& x2)
{int temp=x1;x1=x2;x2=temp;
}
这样我们在使用时,不用额外取地址使用它。就很方便了。
它的使用:
1.做返回值:
之前的:

int Count()
{int a = 10;a++;return a;
}int main()
{int ret = Count();cout << ret << endl;return 0;
}
我们先了解,这样的返回时,它是直接返回吗?不是的,它是先创建一个临时变量 后拷贝才返回的。
那么我们使用引用又是怎么返回的呢?
int& Count()
{static int a = 10;a++;return a;
}int main()
{int ret = Count();cout << ret << endl;return 0;
}

但是这里的话,变成了这样:
int Count()
{int a = 10;a++;return a;
}int main()
{int ret = Count();cout << ret << endl;return 0;
}
引用的话,会出现什么问题呢?
1.这里的ret是个随机值。
2.因为如果Count函数结束后,栈帧销毁,若没有销毁清除的话,ret是碰巧是正确的。
但是,若如果Count函数结束后,栈帧销毁,若销毁清除的话,ret是错误的。是个随机值。
那么为啥上面那个就行呢?因为它加了static静态变量,它是在静态区的,它在外面不会改变的
我们可以看到下面的图,第二个不符合我们的预期12对吧?
随机值:
总结:
1.基本任何情况下都可以引用传参。
2.谨慎用引用作为返回值。出了函数作用域,对象就不在了,就不能用引用返回,若还在就可以用引用返回。

传值和传引用之间的比较:
1.引用做参数---->输出型参数
2.引用做参数---->减少拷贝,提高效率。
3.引用做返回值---->减少拷贝,提高效率
4.引用做返回值---->修改返回值+获取返回值
几种情况:
引用的权限可以平移,缩小,但是不可以放大
//平移
int main()
{int x = 10;int& b = x;const int& c = x;x++;return 0;
}
int main()
{int x = 10;int& b = x;const int& c = x;x++;c++;//错误的,这相当于放大了权限return 0;
}
当我们写出下面的代码,发现它可以被编译,为什么呢?因为在d赋值给a时,它会产生一个int的临时变量,而临时变量具有常性,所以会不报错误。
int main()
{double d = 1.1;int a = d;const int& c = d; 结果是c=1return 0;
}
权限放大:下面的是int& ret1后,因为不是之间返回的,而是会产生一个临时变量,所以引用后,是临时变量的别名,而不是x的别名,这就造成了权限的放大,发生错误。

引用和指针在汇编代码的对比:发现他们的底层逻辑都是差不多的。
##引用和指针的不同点:
1. 引用概念上定义一个变量的别名,指针存储一个变量地址。
2. 引用在定义时必须初始化,指针没有要求
3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
4. 没有NULL引用,但有NULL指针
5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32
位平台下占4个字节)
6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
7. 有多级指针,但是没有多级引用
8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
9. 引用比指针使用起来相对更安全
七: 内联函数
如果是下面的代码,要调用很多层,开辟栈帧,是不是空间效率就非常地低?
int Add(int x, int y)
{return (x + y) * 10;
}int main()
{for (int i = 0; i < 10000; i++){cout << Add(i, i + 1) << endl;}
那么,在C语言中,我们之前是学过宏的。
c语言预处理知识点笔记-CSDN博客
忘记知识点的可以去看看。
易错1:里面不用写类型
易错2:不用加;
易错3:不用吝啬加()
//#define Add(int x, int y) return (x+y)*10; 错误
//#define Add(x, y) x+y*10 ×:括号
//#define Add(x, y) (x+y)*10
//#define Add(x, y) ((x)+(y)*10) √
但是:宏的劣势:
/优点-- 不需要建立栈帧,提高调用效率
缺点-- 复杂,容易出错、可读性差、不能调试
为了解决这种问题:
C++专门出了内联,避免以上的问题:
概念:
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
适用于短小的频繁调用的函数
inline对于编译器仅仅只是一个建议,最终是否成为inline,编译器自己决定
像类似函数就加了inline也会被否决掉
1、比较长的函数
2、递归函数
默认debug模式下,inline不会起作用,否则不方便调试了
inline int Add(int x, int y)
{return (x + y) * 10;
}int main()
{for (int i = 0; i < 10000; i++){cout << Add(i, i + 1) << endl;}
}
特性:
1. inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率。
2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同
即:内联只是向编译器发出请求,实际的决定权(去不去执行)还是在编译器手中
3.3. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址
了,链接就会找不到
// F.h#include <iostream> using namespace std; inline void f(int i);// F.cpp #include "F.h" void f(int i) {cout << i << endl; }// main.cpp #include "F.h" int main() {f(10);return 0; }// 链接错误:main.obj : error LNK2019: 无法解析的外部符号 "void __cdeclf(int)" (?f@@YAXH@Z),该符号在函数 _main 中被引用
宏的优缺点?
优点: 1.增强代码的复用性。2.提高性能。
缺点: 1.不方便调试宏。(因为预编译阶段进行了替换) 2.导致代码可读性差,可维护性差,容易误用。3.没有类型安全的检查 。
C++有哪些技术替代宏?
1. 常量定义 换用const enum(目前还没有学到)
2. 短小函数定义 换用内联函数
八:auto关键字(C++11)
在写程序时,我们有时会随程序的复杂度:
1. 类型难于拼写
2. 含义不明确导致容易出错
介绍:
在C++11,auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得
注意:
用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。
使用规则:
1. auto与指针和引用结合起来使用
用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&
int x = 10;
auto& c = x;//c==10;一样的:
auto a = &x;
auto* b = &x;
2. 在同一行定义多个变量
当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。
auto a = 1, b =5;
auto c = 2, d = 1.1; //错误的
auto不能推导的场景
1. auto不能作为函数的参数
ps:auto不能作为形参类型,因为编译器无法对a的实际类型进行推导
2. auto不能直接用来声明数组其中,auto最常用的还有跟for循环用的:
for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围
int arr[]={1,2,3,4,5,6,7,8,9,10};for(auto& e:arr) {cout<<e<<endl; }注意:与普通循环类似,可以用continue来结束本次循环,也可以用break来跳出整个循环。
九:指针空值nullptr(C++11)
在c语言中,我们使用空指针时常常用NULL,但是实际上空指针是一个宏,
#ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endifvoid f(int) {cout<<"f(int)"<<endl; }void f(int*) {cout<<"f(int*)"<<endl; }int main() {f(0);f(NULL);f((int*)NULL);return 0; }如果上面想通过f(NULL)调用指针版本的f(int*)函数,但是由于NULL被定义成0,这就与本意相反了
1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的
2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。
好了,这次记录笔记环节就结束了,
十:到了我们的鸡汤部分:
你准备独自远行,忍受孤独和孤独,忍受身心的压迫,让汗水化为泪水,但你的脚步从未停止。干得好,即使不能获得桂冠,只要坚持下去,一定会得到最后的掌声。

相关文章:
C++入门基础知识1
今天,我们正式来学习C,由于C是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等。熟悉C语言之后,对C学习有一定的帮助。 现在我们这篇主要是: 1. 补充C语言语法…...
神经网络AI原理回顾
长期记忆存储在大模型的参数权重中,不经过推理和编码无法读取,且必须依赖输入的提示,因为大模型不会无缘无故的自言自语,毕竟输入层是它唯一 与外界交互的窗口。 目前个性化大模型的局限就是训练成本过高,除非使用RAG&…...
PPT 小黑第38套
对应大猫40 幻灯片母板-最后一页-重命名为奇数页 奇偶页-点中标题-形状格式-形状填充-青色 最后一页页码左对齐 更换幻灯片背景:设计-设置背景格式-图片填充 【开始】-段落居中,对齐文本-中部对齐,排列-对齐-底端,-再水平居中…...
主时钟与虚拟时钟约束
1、主时钟约束 1.1、主时钟约束语法: create_clock -name< clock_name > -period <period> -waveform{ <rise_time> <fall_time> } [get_ports< port_name >] 说明: name 之后的<clock_name> 是clk 的name&a…...
K8S学习之基础六:k8s中pod亲和性
Pod节点亲和性和反亲和性 podaffinity:pod节点亲和性指的是pod会被调度到更趋近与哪个pod或哪类pod。 podunaffinity:pod节点反亲和性指的是pod会被调度到远离哪个pod或哪类pod 1. Pod节点亲和性 requiredDuringSchedulingIgnoredDuringExecution&am…...
如何通过rust实现自己的web登录图片验证码
在进行web系统开发时,为保障系统登录安全,登录页面中的验证码必不可少。在java中,我们可以利用相应的2D图像库快速生成图形验证码,而对于rust,我们没有合适的标准库进行图像验证码的生成。今天,我们通过使用…...
盛京开源社区加入 GitCode,书写东北开源生态新篇章
在数字化转型与开源技术蓬勃发展的浪潮下,开源社区已成为推动技术创新的核心力量。盛京开源社区(SJOSC)作为沈阳地区的开源交流平台,始终致力于连接开发者、企业及高校,构建区域技术生态圈。 现在,盛京开源…...
QKV 注意力机制在Transformer架构中的作用,和卷积在卷积神经网络中的地位,有哪些相似之处?
QKV 注意力机制在Transformer架构中的作用,和卷积在卷积神经网络中的地位,有哪些相似之处? QKV(Query-Key-Value)注意力机制在Transformer架构和卷积在卷积神经网络(CNN)中都起着核心作用&…...
高效与高并发API开发:使用FastAPI与Redis实现请求限制与速率控制
高效与高并发API开发:使用FastAPI与Redis实现请求限制与速率控制 📚 目录 API速率限制的基本概念Redis实现分布式速率限制防止DDoS攻击的常见策略基于IP或用户身份的访问频率控制 1. API速率限制的基本概念 API速率限制(Rate Limiting&…...
Centos7源码编译安装Sqlite最新版本
下载源码 https://www.sqlite.org/download.html 复制下载链接,然后用 wget 下载 wget https://www.sqlite.org/2025/sqlite-autoconf-3490100.tar.gz 解压缩编译安装 tar -zxf sqlite-autoconf-3490100.tar.gz cd sqlite-autoconf-3490100 ./configure --prefi…...
mybatis热点面试题第五弹
1. MyBatis与Hibernate的区别 答案: MyBatis: 不完全是一个ORM框架,需要手动编写SQL语句,灵活性高,适合对数据库操作有高性能要求的场景。缺点是无法做到数据库无关性,如果需要支持多种数据库,…...
KTransformers部署 使671B DeepSeek R1成「办公桌标配」
671B DeepSeek R1成「办公桌标配」 1. 什么是KTransformersDeepSeek 版本技术破局密钥:强稀疏化MoE模型需要全新的私有化架构设计趋境AI大模型推理软硬一体工作站——让大模型推理门槛降低10倍 2. 准备环境3 环境准备与资源下载4 安装过程1. linux环境搭建2. window…...
sql-labs less5-8
Less-5 双注入 基于单引号的字符型注入,涉及二次查询注入 Less-6 双注入 基于双引号的字符型注入,涉及二次查询注入 Less-7 字符型注入 基于单引号变形注入之导入文件 Less-8 布尔盲注 不返回任何错误信息,通过布尔逻辑判断 以下…...
一个大型应用的云原生一般有多少个服务?
DeepSeek R1 思考 1 秒 思考过程 在云原生架构中,大型应用的服务规模呈现动态分布特征。根据行业实践和架构模式分析,服务划分的核心考量维度包括: 一、业务领域驱动划分 核心业务服务群(通常15-30个) 用户中心&…...
Linux下安装VS Code
Centos 7 https://blog.csdn.net/weixin_63790642/article/details/132927888 安装存储库 sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc密钥 sudo sh -c echo -e "[code]\nnameVisual Studio Code\nbaseurlhttps://packages.microsoft.com/yum…...
【零基础到精通Java合集】第一集:Java开发环境搭建
以下是针对**“Java开发环境搭建”**的15分钟课程内容设计,包含知识点拆分、实操演示与互动练习: 课程标题:Java开发环境搭建(15分钟) 目标:完成JDK安装、IDE配置并运行第一个Java程序 一、课程内容与时间分配 0-2分钟 课程目标与前置准备 明确学习目标:JDK安装、环境…...
Rocky Linux 系统安装 typecho 个人博客系统(Docker 方式)
typecho 博客系统安装 官网: https://typecho.org/ 1. 安装 Docker curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo && yum install docker-ce -y && docker -v && systemctl enable --now docker…...
C++-第二十一章:特殊类设计
目录 第一节:特殊类 1-1.不能被拷贝的类 1-2.只能在堆上构造的类 1-3.只能在栈上构造的类 1-4.只能构造一个对象的类 第二节:工厂模式 下期预告: 第一节:特殊类 1-1.不能被拷贝的类 不能被拷贝的类有线程类、std::unique_ptr、…...
pytorch 模型测试
在使用 PyTorch 进行模型测试时,一般包含加载测试数据、加载训练好的模型、进行推理以及评估模型性能等步骤。以下为你详细介绍每个步骤及对应的代码示例。 1. 导入必要的库 import torch import torch.nn as nn import torchvision import torchvision.transforms as trans…...
在kali linux中kafka的配置和使用
官方文档 一、安装依赖 删除原有的jdk sudo apt remove --purge openjdk-\* sudo apt clean安装 Java (JDK 11) sudo apt install openjdk-11-jdk -y # 验证安装 java -version二、下载并解压 Kafka 下载 Kafka wget https://dlcdn.apache.org/kafka/3.9.0/kafka_2.13-3.9.0.t…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...













