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

C++区别于C语言的提升用法(万字总结)

1.namespace产生原因

在C语言中,变量,函数,以至于类都是大量存在的,因此会产生大量的名称存在于全局作用域中,可能产生很多冲突,至此c++的祖师爷为避免命名冲突和名字的污染,造出来了关键字namespace来解决这种问题

1.2查找规则

c/c++规定用任何变量类型的函数都要向上访问,在向上的过程中去找到他的出处在编译时候查找没有在去全局中找。

例如;

在c语言中rand是包含在头文件#include<stdlib,h>中的函数,因此编译器无法判断是函数还是变量。但事实上用c++可以完美解决。

2.namespace的特点

2.1用namespace来定义命名空间

后加名字加{成员},可定义变量/函数/类型。

1.在命名空间中定义的变量。

2.定义函数。

3.定义结构体类型。

2.2本质是定义一个全局域各自独立

如2.1中的a在不同的域中可以定义同名且不冲突。

2.3 c++中的域

函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响 编译查找逻辑,还会影响变量的⽣命周期,命名空间域和类域不影响变量⽣命周期。

 局部域

局部域是指在函数、代码块(如ifforwhile语句块)内部定义的变量所处的作用域。在局部域中定义的变量,其生命周期从定义的位置开始,到所在的代码块结束时终止。当程序执行离开该代码块时,局部变量所占用的内存会被自动释放。

#include <iostream>void testLocalScope() {// 局部变量 a,生命周期从这里开始int a = 10;std::cout << "Local variable a: " << a << std::endl;// 代码块结束,局部变量 a 的生命周期结束
}int main() {testLocalScope();// 这里无法访问局部变量 areturn 0;
}

 全局域

全局域是指在所有函数、类和命名空间之外定义的变量所处的作用域。全局变量的生命周期从程序开始执行时就已经分配内存,直到程序结束时才会释放内存。

#include <iostream>// 全局变量 b,生命周期从程序开始
int b = 20;void testGlobalScope() {std::cout << "Global variable b: " << b << std::endl;
}int main() {testGlobalScope();// 全局变量 b 仍然可以访问std::cout << "Global variable b in main: " << b << std::endl;// 程序结束,全局变量 b 的生命周期结束return 0;
}

  命名空间域

命名空间域主要用于解决命名冲突的问题,它只是对标识符进行逻辑上的分组,并不影响变量的生命周期。在命名空间中定义的变量,其生命周期取决于它是全局变量还是局部变量。

#include <iostream>
// 全局命名空间
namespace GlobalNS {int globalVar = 10;void globalFunction() {std::cout << "This is a function in the global namespace. globalVar = " << globalVar << std::endl;}
}
void testLocalNamespace() {// 局部命名空间namespace LocalNS {int localVar = 20;void localFunction() {std::cout << "This is a function in the local namespace. localVar = " << localVar << std::endl;}}// 使用局部命名空间中的变量和函数std::cout << "Value of localVar in LocalNS: " << LocalNS::localVar << std::endl;LocalNS::localFunction();// 也可以使用全局命名空间中的变量和函数std::cout << "Value of globalVar in GlobalNS: " << GlobalNS::globalVar << std::endl;GlobalNS::globalFunction();
}int main() {// 可以直接在 main 函数中使用全局命名空间std::cout << "Value of globalVar in GlobalNS (from main): " << GlobalNS::globalVar << std::endl;GlobalNS::globalFunction();// 调用包含局部命名空间的函数testLocalNamespace();// 尝试在 main 函数中使用局部命名空间(这是错误的,因为局部命名空间超出了作用域)// 下面这行代码会导致编译错误// std::cout << LocalNS::localVar << std::endl;return 0;
}

域的名字在自己内部只能用一次,同一个域名字不能重复,但不同的域可以

2.4 namespace只能定义在全局,当然他还可以嵌套定义

图1;嵌套后要区别调用

图二注:当库很大或项目大还可以套中套来解决命名冲突 

 2.5项⽬⼯程中多⽂件

项⽬⼯程中多⽂件中定义的同名namespace会认为是⼀个namespace,不会冲突。

多⽂件中可以定义同名namespace,他们会默认合并到⼀起,就像同⼀个namespace⼀样

定个文件一个命名空间都会封在一起 

例如:当同时定义栈与队列 会产生多个文件

3.命名空间使用

 编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间⾥⾯去查找。所以 下⾯程序会编译报错。所以我们要使⽤命名空间中定义的变量/函数,有三种⽅式:

3.1指定命名空间访问

不易出错,推荐使用

3.2 展开命名空间中全部成员(展开头文件与命名空间的区别)

展开命名空间中全部成员--》变成全局变量因此可能造成命名冲突

展开头文件是将头文件在预处理阶段将头文件的代码拷贝过来

不推荐,冲突风险大,但是在小练习中为方便推荐使用。

3.3折中using将命名空间中某个成员展开

 当a用的不多但是b用的多是将b解开变成全局;

项⽬中经常访问的不存在冲突的成员推荐这种⽅式

 前提了解

<<是流插入运算符,>>是流提取运算符。(C语⾔还⽤这两个运算符做位运算左移/右移)

cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中

C++输⼊&&输出&&换行 

1包含文件#include<iostream> 

是Input Output Stream 的缩写,是标准的输⼊、输出流库,定义了标准的输⼊、输出对象。

2输出 

std::cout是iostream类的对象,它主要⾯向窄字符的标准输出流。

#include <iostream>
int main()
{int a = 0;double b = 0.1;char c = 'x';
//自动识别变量类型std::cout << a << std::endl;std::cout << b << " " << c << std::endl;return 0;
}

好处:1.连续输出并且与printf可以一起使用2.可自动识别所输出的类型

坏处:此用法控制输出的小数繁琐相比用printf更好用些

3输入

std::cin是istream类的对象,它主要⾯向窄字符的标准输⼊流。

#include <iostream>
int main()
{int a = 0;double b = 0.1;char c = 'x';std::cin >> a;std::cin >> b >> c;std::cout << "输出"<<std::endl;std::cout << a << std::endl;std::cout << b << " " << c << std::endl;return 0;
}

注:cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要 通过命名空间的使⽤⽅式去⽤他们。

4.换行

std::endl是⼀个函数,流插⼊输出时,相当于插⼊⼀个换⾏字符加刷新缓冲区。

相比与在C语言中学到的“/n”在c++中std::endl在不同平台上都可以运行

上述图片有其应用

缺省函数

1.缺省参数说明

将声明或定义函数时的参数指定一个值(该值即为缺省值)

注:当实参没有指定数值就采用缺省值否则采用实参。

#include <iostream>
#include <assert.h>
using namespace std;
void Func(int a = 0)//在形参后面加个值
{cout << a << endl;
}
int main()
{Func(); // 没有传参时,使⽤参数的默认值 Func(10); // 传参时,使⽤指定的实参 return 0;
}

2.缺省参数的分类

全缺省就是全部形参给缺省值

 

 半缺省就是部分形参给缺省值

 

注 :C++规定半缺省参数必须从右往左 依次连续缺省,不能间隔跳跃给缺省值。

 

 

3.应用

例如,在栈构建空间时会动态开辟通常以二的倍速增加一定就会亏损,因此控制空间大小显得尤为重要。

// Stack.h
#include <iostream>
#include <assert.h>
using namespace std;
typedef int STDataType;
typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;
void STInit(ST* ps, int n = 4);
// Stack.cpp
#include"Stack.h"
// 缺省参数不能声明和定义同时给 
void STInit(ST* ps, int n)
{assert(ps && n > 0);ps->a = (STDataType*)malloc(n * sizeof(STDataType));ps->top = 0;ps->capacity = n;
}
// test.cpp
#include"Stack.h"
int main()
{ST s1;STInit(&s1);// 确定知道要插⼊1000个数据,初始化时⼀把开好,避免扩容 ST s2;STInit(&s2, 1000);return 0;
}

在初始化中确定知道要插⼊1000个数据,初始化时⼀把开好,避免扩容

注:当文件中声明与定义分开时,缺省参数只等在声明中给缺省值。

因为:在定义中只有在编译的时候才会调用。 

c++函数重载

 C++⽀持在同⼀作⽤域中出现同名函数

但是分为参数类型不同,参数个数不同,参数顺序不同

1.参数类型不同

int Add(int left, int right)
{cout << "int Add(int left, int right)" << endl;return 0;
}
double Add(double left, double right)
{cout << "double Add(double left, double right)" << endl;return 0;
}
int main()
{Add(10, 20);Add(10.1, 20.2);return 0;
}

2、参数个数不同  

#include <iostream>
using namespace std;
void f()
{cout << "f()" << endl;
}
void f(int a)
{cout << "f(int a)" << endl;
}
int main()
{f();f(10);return 0;

3、参数类型顺序不同(类型不同)

#include <iostream>
using namespace std;
void f(int a, char b)
{cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{cout << "f(char b, int a)" << endl;
}
int main()
{f(10, 'a');f('a', 10);return 0;
}

特殊的 

1.返回值不同

不能作为重载条件,因为调⽤时也⽆法区分

void fxx()
{
}
int fxx()
{return 0;
}

2.一个参数问题

f()但是调⽤时,会报错,存在歧义,编译器不知道调⽤谁

void f1()
{cout << "f()" << endl;
}
void f1(int a = 10)
{cout << "f(int a)" << endl;
}

引用

 一,概念

是对已知的变量取别名,并与它引用的对象共用同一块空间

类型& 引⽤别名 = 引⽤对象;

int a = 0;
// 引⽤:b和c是a的别名
int& b = a;

就像在《西游记》中孙悟空(变量)可以叫孙大圣悟空猴哥。这里指的全是他一个人(空间)。

 但是,不得不🤮一下祖师爷当初设计的与C语言相同符号&,让后续辨析&费了很大劲。

 二,引用的特征

•🔪 引⽤在定义时必须初始化

int main()
{
int a = 10;
int& ra;
return 0;
}

•🔪🔪⼀个变量可以有多个引⽤

int main()
{
int a = 0;
int& b = a;
int& c = a;
cout << &a << endl;
cout << &b << endl;
cout << &c << endl;
return 0;
}

typedef unsigned int uint;

这⾥取地址我们看到是⼀样的

•🔪🔪🔪 引⽤⼀旦引⽤⼀个实体,再不能引⽤其他实体

int main()
{int a = 0;int d = 1;int& b = a;int& b = d;return 0;
}

三 ,引用的使用

🥤引用传参->减少拷贝提高效率

图一中形参是实参的拷贝有4*1000=4000个字节

🌸图二图三都是引用传参的方法

辨析图二为传指针占4/8个字节,而图三是别名不另开空间

🥤引用作返回值->改变引用对象的同时改变被引用对象

在我们在实现栈中有top取栈顶元素

❌ ❌    ❌  中间商  ❌    ❌    ❌                             ✅  ✅   ✅  无中间商 ✅  ✅   ✅

取栈顶元素中为什么会❌ 呐

因为c/c++规定返回值存在临时寄存器(中间商)中,所以被引用对象改变时已经销毁了产生野指针(进栈创建出栈就销毁)通俗->(进函数创建出函数就销毁)-

那传引用为什么✅那

返回的栈是在堆中建立的所以没有了野指针且返回的是别名无临时变量(中间商)

引用传参

在函数调用时,若采用值传递,会把实参的值复制一份给形参,这在处理大型对象(如大型结构体、类对象)时,会带来较大的性能开销。而引用传参则是将实参的引用传递给形参,不会进行对象的拷贝,从而提高效率。此外,由于引用是对象的别名,对引用形参的修改会直接影响到实参

#include <iostream>
#include <string>// 引用传参
void modifyString(std::string& str) {str += " - Modified";
}// 值传参
void modifyStringByValue(std::string str) {str += " - Modified by value";
}int main() {std::string original = "Hello";std::cout << "Before modification: " << original << std::endl;// 调用引用传参的函数modifyString(original);std::cout << "After modification by reference: " << original << std::endl;std::string another = "World";std::cout << "\nBefore value modification: " << another << std::endl;// 调用值传参的函数modifyStringByValue(another);std::cout << "After value modification: " << another << std::endl;return 0;
}

代码解释

  • modifyString 函数使用引用传参,直接对传入的字符串对象进行修改,调用该函数后,original 字符串会被改变。

  • modifyStringByValue 函数使用值传参,会创建传入字符串的一个副本,对副本的修改不会影响到原始字符串。


引用做返回值

1. 返回全局变量的引用

#include <iostream>// 全局变量
int globalValue = 10;// 返回全局变量的引用
int& getGlobalValue() {return globalValue;
}int main() {// 获取全局变量的引用int& ref = getGlobalValue();std::cout << "Original value: " << ref << std::endl;// 通过引用修改全局变量的值ref = 20;std::cout << "Modified value: " << globalValue << std::endl;return 0;
}
  • globalValue 是一个全局变量,其生命周期贯穿整个程序。

  • getGlobalValue 函数返回 globalValue 的引用,在 main 函数中通过引用 ref 可以直接访问和修改 globalValue 的值。

2. 返回类成员变量的引用

#include <iostream>class MyClass {
private:int memberValue;
public:MyClass(int value) : memberValue(value) {}// 返回类成员变量的引用int& getMemberValue() {return memberValue;}
};int main() {MyClass obj(30);// 获取类成员变量的引用int& ref = obj.getMemberValue();std::cout << "Original member value: " << ref << std::endl;// 通过引用修改类成员变量的值ref = 40;std::cout << "Modified member value: " << obj.getMemberValue() << std::endl;return 0;
}
  • MyClass 类包含一个私有成员变量 memberValue

  • getMemberValue 函数返回 memberValue 的引用,在 main 函数中通过引用 ref 可以直接访问和修改 memberValue 的值。

 返回数组元素的引用

#include <iostream>// 函数返回数组元素的引用
int& getArrayElement(int arr[], int index) {return arr[index];
}int main() {int myArray[5] = {1, 2, 3, 4, 5};// 获取数组元素的引用int& ref = getArrayElement(myArray, 2);std::cout << "Original array element: " << ref << std::endl;// 通过引用修改数组元素的值ref = 10;std::cout << "Modified array element: " << myArray[2] << std::endl;return 0;
}

代码解释

  • getArrayElement 函数接受一个数组和一个索引作为参数,返回数组中指定索引位置元素的引用。

  • 在 main 函数中通过引用 ref 可以直接访问和修改数组元素的值。

注意事项

  • 避免返回局部变量的引用:局部变量在函数结束时会被销毁,返回其引用会导致未定义行为。例如:

    // 错误示例:返回局部变量的引用
    int& getLocalValue() {int localVar = 5;return localVar; // 错误:返回局部变量的引用
    }

  • 使用 const 引用:如果不希望通过返回的引用修改对象的值,可以返回 const 引用。例如
const int& getReadOnlyValue(const int& value) {return value;
}

const引⽤

可以引⽤⼀个const对象,但是必须⽤const引⽤。const引⽤也可以引⽤普通对象,因为对象的访 问权限在引⽤过程中可以缩⼩,但是不能放⼤。

所谓临时对象就是编译器需要⼀个空间暂存表达式的求值结果时临时创建的⼀个未命名的对象, C++中把这个未命名对象叫做临时对象。

在类型转换中会产⽣临时对 象存储中间值,也就是时,b和c引⽤的都是临时对象,⽽C++规定临时对象具有常性,所以这⾥ 就触发了权限放⼤,必须要⽤常引⽤才可以。

解析例子

指针和引⽤的关系

C++中指针和引⽤就像两个性格迥异的亲兄弟,指针是哥哥,引⽤是弟弟,在实践中他们相辅相成,功能有重叠性,但是各有⾃⼰的特点,互相不可替代。

• 语法概念上引⽤是⼀个变量的取别名不开空间,指针是存储⼀个变量地址,要开空间。

• 引⽤在定义时必须初始化,指针建议初始化,但是语法上不是必须的。

• 引⽤在初始化时引⽤⼀个对象后,就不能再引⽤其他对象;⽽指针可以在不断地改变指向对象。 • 引⽤可以直接访问指向对象,指针需要解引⽤才是访问指向对象。

• sizeof中含义不同,引⽤结果为引⽤类型的⼤⼩,但指针始终是地址空间所占字节个数(32位平台下 占4个字节,64位下是8byte)

• 指针很容易出现空指针和野指针的问题,引⽤很少出现,引⽤使⽤起来相对更安全⼀些。  

拓展 

💩(辨析)#define与typedef与引用的不同

#define N 10;

定义宏(#define)的常亮,N替换成宏用符号代替常量 好处:是预处理阶段将N换成10.

typedef unsinged int uint;

typedef :给类型取别名

🪡引用的底层逻辑 

​​

这是对引用和指针的汇编代码

发现划横线的地方相同---->>>引用的底层是指针 

nullptr

 了解nullptr之前我们要知道

  • ❓c++为什么不用NULL反而用nullptr。
  • ❓nullptr它与NULL的区别是什么?

NULL 

是⼀个

🍦🍦🍦在c++中被定义为从常量0,而C语言中被定义为无类型指针(void*)常量

会产生两种问题

#include<iostream>
using namespace std;
void f(int x)
{
cout << "f(int x)" << endl;
}
void f(int* ptr)
{
cout << "f(int* ptr)" << endl;
}
int main()
{
f(0);
f((int*)NULL);
// f((void*)NULL);
f(nullptr);
return 0;
}

 🍞问题一

f(NULL);

本想通过f(NULL)调⽤指针版本的f(int*)函数,但是由于NULL被定义成0,调⽤了f(int x),因此与程序的初衷相悖

🍞🍞 问题二

f((int*)NULL);
f((char*)NULL);

我们在调用空值指针返回空🈳的时候要强转不同类型。

有没有能直接调用的呢。

nullptr

  • 🌸🌸ta⼀个特殊的关键字(值为零)

  • 🌸ta可以转换成任意其他类型的指针类型<--相当于->f((类型*)NULL);

  • #include<iostream>
    using namespace std;
    void f(char* x)
    {cout << "f(char* x)" << endl;
    }
    void f(int* ptr)
    {cout << "f(int* ptr)" << endl;
    }
    int main()
    {f(nullptr);return 0;
    }

  • 一定要想好写的是什么在调用。

  • 如果不确定就强制类型转换

  • 	f((int* )nullptr);f((char*)nullptr);

内联函数的概念

 以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数的使用可以提升程序的运行效率。
 我们可以通过观察调用普通函数和内联函数的汇编代码来进一步查看其优势:

int Add(int a, int b)
{return a + b;
}
int main()
{int ret = Add(1, 2);return 0;
}

下图左是以上代码的汇编代码,下图右是函数Add加上inline后的汇编代码:

从汇编代码中可以看出,内联函数调用时并没有调用函数这个过程的汇编指令。 

内联函数的特性
 1、inline是一种以空间换时间的做法,省了去调用函数的额外开销。由于内联函数会在调用的位置展开,所以代码很长或者有递归的函数不适宜作为内联函数。频繁调用的小函数建议定义成内联函数。
 2、inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有递归等,编译器优化时会忽略掉内联。
 3、inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了链接就会找不到。

 auto 

auto的使用细则

一、auto与指针和引用结合起来使用
 用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时必须加&。

#include <iostream>
using namespace std;
int main()
{int a = 10;auto b = &a;   //自动推导出b的类型为int*auto* c = &a;  //自动推导出c的类型为int*auto& d = a;   //自动推导出d的类型为int//打印变量b,c,d的类型cout << typeid(b).name() << endl;//打印结果为int*cout << typeid(c).name() << endl;//打印结果为int*cout << typeid(d).name() << endl;//打印结果为intreturn 0;
}

注意:用auto声明引用时必须加&,否则创建的只是与实体类型相同的普通变量。

二、在同一行定义多个变量
 当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。

int main()
{auto a = 1, b = 2; //正确auto c = 3, d = 4.0; //编译器报错:“auto”必须始终推导为同一类型return 0;
}

auto不能推导的场景

一、auto不能作为函数的参数
 以下代码编译失败,auto不能作为形参类型,因为编译器无法对x的实际类型进行推导。

int main()

简化代码,替代写起来长的类型

auto自动判断类型或别名

2.也可用于返回值与函数返回类型(不建议多用)

for流

概念

相关文章:

C++区别于C语言的提升用法(万字总结)

1.namespace产生原因 在C语言中&#xff0c;变量&#xff0c;函数&#xff0c;以至于类都是大量存在的&#xff0c;因此会产生大量的名称存在于全局作用域中&#xff0c;可能产生很多冲突&#xff0c;至此c的祖师爷为避免命名冲突和名字的污染&#xff0c;造出来了关键字names…...

创新项目实训开发日志4

一、开发简介 核心工作内容&#xff1a;logo实现、注册实现、登录实现、上传gitee 工作时间&#xff1a;第十周 二、logo实现 1.设计logo 2.添加logo const logoUrl new URL(/assets/images/logo.png, import.meta.url).href <div class"aside-first">…...

ospf综合作业

需求 需求分析 区域划分&#xff1a; 网络划分为 area 0、area 1、area 2、area 3、area 4 多个区域。其中 area 0 作为骨干区域&#xff0c;其他为非骨干区域。这种划分符合 OSPF&#xff08;开放式最短路径优先&#xff09;协议中区域设计原则&#xff0c;不同区域通过 ABR…...

旋转磁体产生的场-对导航姿态的影响

pitch、yaw、roll是描述物体在空间中旋转的术语&#xff0c;通常用于计算机图形学或航空航天领域中。这些术语描述了物体绕不同轴旋转的方式&#xff1a; Pitch&#xff08;俯仰&#xff09;&#xff1a;绕横轴旋转&#xff0c;使物体向前或向后倾斜。俯仰角度通常用来描述物体…...

Hive 数据同步到 Doris 最佳实践方案:从场景适配到性能调优全解析

在大数据领域&#xff0c;Hive 作为成熟的数据仓库解决方案&#xff0c;常用于海量数据存储与离线处理&#xff0c;而 Doris 凭借其强大的 OLAP 能力&#xff0c;在实时分析、即席查询等场景表现卓越。当企业需要将 Hive 数据仓库中的数据与 Doris 的分析能力结合时&#xff0c…...

netty中的Channel与Java NIO中的Channel核心对比

Netty的Channel和Java NIO的Channel虽然都用于网络通信,但设计理念、功能扩展及适用场景存在显著差异。以下从核心特性、设计模式及性能优化等维度展开对比: 1. 抽象层次与功能范围 Java NIO Channel 基础IO模型:仅支持非阻塞IO(NIO),如SocketChannel、ServerSocketChann…...

基于whisper和ffmpeg语音转文本小程序

目录 一、环境准备 ✅ 第一步&#xff1a;安装并准备 Conda 环境 ✅ 第二步&#xff1a;创建 Whisper 专用的 Conda 虚拟环境 ✅ 第三步&#xff1a;安装 GPU 加速版 PyTorch&#xff08;适配 RTX 4060&#xff09; ✅ 第四步&#xff1a;安装 Whisper 和 FFMPEG 依赖 ✅…...

使用ffmpeg 将图片合成为视频,填充模糊背景,并添加两段音乐

1.输入3张图片,每张播放一次,播放两秒,视频分辨率设置为1920:1080,每张图片前0.3秒淡入,后0.3秒淡出,图片宽高比不变,用白色填充空白区域 ffmpeg -loop 1 -t 2 -i "img1.jpg" \-loop 1 -t 2 -i "img2.jpg" \-loop 1 -t 2 -i "img3.jpg" \-filte…...

Python协程详解:从基础到实战

协程是Python中实现并发编程的重要方式之一&#xff0c;它比线程更轻量级&#xff0c;能够高效处理I/O密集型任务。本文将全面介绍协程的概念、原理、实现方式以及与线程、进程的对比&#xff0c;包含完整的效率对比代码和详细说明&#xff0c;帮助Python开发者深入理解并掌握协…...

服务器部署LLaMAFactory进行LoRA微调

一、什么是LLaMAFactory LlamaFactory 是一个专为 大型语言模型&#xff08;LLM&#xff09;微调 设计的开源工具库&#xff0c;旨在简化大模型&#xff08;如 LLaMA、GPT、Mistral 等&#xff09;的定制化训练流程&#xff0c;降低技术门槛和硬件成本。以下是它的核心功能和应…...

ASP.NET MVC​ 入门指南

以下是一份 MVC&#xff08;Model - View - Controller&#xff09;培训教程&#xff0c;以ASP.NET MVC 为例进行讲解&#xff0c;适合有一定编程基础的学习者快速上手。 1. MVC 概述 1.1 什么是 MVC MVC 是一种软件设计模式&#xff0c;它将应用程序分为三个主要部分&#…...

mapbox高阶,高程影像、行政区边界阴影效果实现

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️line线图层样式1.4 ☘️symbol符号图层…...

如何下载适用于语音识别功能增强的Google Chrome浏览器

谷歌浏览器一直是互联网用户的首选工具之一&#xff0c;尤其是它强大的扩展功能&#xff0c;使得用户可以根据需求定制浏览器。对于需要使用语音识别功能的用户来说&#xff0c;谷歌浏览器提供了优秀的支持&#xff0c;通过简单的设置和插件&#xff0c;可以显著提升语音识别的…...

运维打铁:Centos 7 安装 redis_exporter 1.3.5

文章目录 一、CentOS 7 安装 redis_exporter 1.3.51. 安装2. 配置自启动&#xff0c;并连接 Redis&#xff0c;修改端口3. 配置 Prometheus 采集 redis_exporter 数据4. 配置 Grafana 查看数据5. Redis 集群配置 二、常见问题及解决办法1. 下载二进制包失败2. 解压部署时权限问…...

3台CentOS虚拟机部署 StarRocks 1 FE+ 3 BE集群

背景&#xff1a;公司最近业务数据量上去了&#xff0c;需要做一个漏斗分析功能&#xff0c;实时性要求较高&#xff0c;mysql已经已经不在适用&#xff0c;做了个大数据技术栈选型调研后&#xff0c;决定使用StarRocks StarRocks官网&#xff1a;StarRocks | A High-Performa…...

Oracle 11g RAC ASM磁盘组剔盘、加盘实施过程

环境&#xff1a;AIX6.1 Oracle RAC 11.2.0.3 前期准备&#xff1a; 1.查看DG磁盘组空间情况&#xff1a; –查看DG磁盘组空间情况&#xff1a; ASMCMD> lsdg State Type Rebal Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Of…...

网站高可用架构设计基础——高可用策略和架构原则

一、正面保障与减少损失 要想让系统能够稳定可用&#xff0c;首先要考虑如何避免问题的发生。比如说可以通过 UPS&#xff08;不间断电源&#xff09;来避免服务器断电&#xff0c;可以通过事先增加机器来解决硬件资源不足的问题。 然后&#xff0c;如果问题真的发生了&#…...

从入门到精通【MySQL】视图与用户权限管理

文章目录 &#x1f4d5;1. 视图✏️1.1 视图的基本概念✏️1.2 试图的基本操作&#x1f516;1.2.1 创建视图&#x1f516;1.2.2 使用视图&#x1f516;1.2.3 修改数据&#x1f516;1.2.4 删除视图 ✏️1.3 视图的优点 &#x1f4d5;2. 用户与权限管理✏️2.1 用户&#x1f516;…...

使用QML Tumbler 实现时间日期选择器

目录 引言相关阅读项目结构示例实现与代码解析示例一&#xff1a;时间选择器&#xff08;TimePicker&#xff09;示例二&#xff1a;日期时间选择器&#xff08;DateTimePicker&#xff09; 主窗口整合运行效果总结下载链接 引言 在现代应用程序开发中&#xff0c;时间与日期选…...

[golang] 介绍 | 特点 | 应用场景

“编程不仅仅是写代码&#xff0c;更是一种思考方式。” 参考资料 《Unix编程环境》- Brian W. Kernighan, Rob Pike《程序设计实践》- Brian W. Kernighan, Rob PikeGo语言官方网站&#xff1a;https://golang.orgRob Pike的个人博客&#xff1a;http://herpolhode.com/rob/ …...

Python 爬虫实战 | 企名科技

文章目录 一、企名科技1、目标网站2、网站特点3、确定解密位置4、扣js代码 一、企名科技 1、目标网站 网址&#xff1a;https://wx.qmpsee.com/articleDetail?idfeef62bfdac45a94b9cd89aed5c235be目标数据&#xff1a;获取消费行业研究下面的13篇文章数据 2、网站特点 服…...

c加加学习之day06->STL标准库->day01

1.介绍&#xff1a;C 标准模板库&#xff08;Standard Template Library&#xff0c;简称 STL&#xff09;是一组泛型编程的模板类和函数&#xff0c;旨在提供常用的数据结构、算法和函数对象。STL 是 C 标准库的一部分&#xff0c;极大地提高了编程效率和代码的可重用性。STL …...

并发设计模式实战系列(6):读写锁

&#x1f31f; ​大家好&#xff0c;我是摘星&#xff01;​ &#x1f31f; 今天为大家带来的是并发设计模式实战系列&#xff0c;第六章读写锁模式​​&#xff0c;废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 读写锁三维模型 2. 关键实现原理 二、生活化类比&am…...

【网络原理】从零开始深入理解TCP的各项特性和机制.(一)

本篇博客给大家带来的是网络原理的相关知识.其中传输层这一部分非常重要,面试中只要是涉及到网络这一部分知识,几乎是必定会考传输层TCP的. &#x1f40e;文章专栏: JavaEE初阶 &#x1f680;若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给…...

基于Pytorch的深度学习-第二章

2.1 CIFAR-10数据集简介 CIFAR-10数据集包含10个类别&#xff1a;plane、car、bird、cat、deer、dog、frog、horse、ship、truck&#xff0c;每个类别有6000张图片。其中训练集图片有50000张&#xff0c;测试集有10000张图片。训练集和测试集的生成方法是&#xff0c;分别从每…...

gitlab-ce容器镜像源(国内)

下载命令 docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/gitlab/gitlab-ce:17.10.4-ce.0 更多参考&#xff1a; https://docker.aityp.com/image/docker.io/gitlab/gitlab-ce:17.10.4-ce.0...

TinyVue v3.22.0 正式发布:深色模式上线!集成 UnoCSS 图标库!TypeScript 类型支持全面升级!

我们非常高兴地宣布&#xff0c;2025年4月7日&#xff0c;TinyVue发布了v3.22.0&#x1f389;。 本次 3.22.0 版本主要有以下重大变更&#xff1a; 支持深色模式增加基于 UnoCSS 的图标库更丰富的 TypeScript 类型声明支持 XSS 配置 详细的 Release Notes 请参考&#xff1a…...

Browser-Use WebUI:让AI自动使用浏览器帮你查询信息执行任务

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

使用PyTorch如何配置一个简单的GTP

目录 一、什么是GPT 1. Transformer Block 的核心结构​ ​2. 关键组件解析​ ​​(1) 掩码多头自注意力&#xff08;Masked Multi-Head Self-Attention&#xff09;​​ ​​(2) 前馈神经网络&#xff08;FFN&#xff09;​​ ​​(3) 层归一化&#xff08;LayerNorm&…...

【FAQ】针对于消费级NVIDIA GPU的说明

概述 本文概述 HP Anyware 在配备消费级 NVIDIA GPU 的物理工作站上的关​​键组件、安装说明和重要注意事项。 注意&#xff1a;本文档适用于 NVIDIA 消费级 GPU。NVIDIA Quadro 和 Tesla GPU 也支持 HP Anyware 在公有云、虚拟化或物理工作站环境中运行。请参阅PCoIP Graphi…...

02_java的运行机制以及JDKJREJVM基本介绍

1、运行机制 2、JDK&JRE&JVM JDK 基本介绍 &#xff08;1&#xff09; JDK 的全称(Java Development Kit Java开发工具包) JDK JRE java的开发工具 [ java, javac, javadoc, javap等 ] &#xff08;2&#xff09;JDK是提供给Java开发人员使用的&#xff0c;其…...

go 的 net 包

目录 一、net包的基本功能 1.1 IP地址处理 1.2 网络协议支持 1.3 连接管理 二、net包的主要功能模块 2.1 IP地址处理 2.2 TCP协议 2.3 UDP协议 2.4 Listener和Conn接口 三、高级功能 3.1 超时设置 3.2 KeepAlive控制 3.3 获取连接信息 四、实际应用场景 4.1 Web服…...

ShenNiusModularity项目源码学习(21:ShenNius.Admin.Mvc项目分析-6)

菜单列表页面用于新建、维护及删除系统所有模块所需的菜单信息&#xff0c;包括菜单名称、菜单中的按钮、菜单关联的后台服务地址及请求方式等。菜单列表页面的后台控制器类MenuController位于ShenNius.Admin.Mvc项目的Areas\Sys\Controllers内&#xff0c;页面文件位于同项目的…...

基于单片机的游泳馆智能管理系统

标题:基于单片机的游泳馆智能管理系统 内容:1.摘要 随着人们生活水平的提高&#xff0c;游泳馆的规模和客流量不断增大&#xff0c;传统的管理方式已难以满足高效、便捷的管理需求。本研究的目的是设计并实现一种基于单片机的游泳馆智能管理系统。方法上&#xff0c;采用单片机…...

开发了一个b站视频音频提取器

B站资源提取器-说明书 一、功能说明 本程序可自动解密并提取B站客户端缓存的视频资源&#xff0c;支持以下功能&#xff1a; - 自动识别视频缓存目录 - 将加密的.m4s音频文件转换为标准MP3格式 - 将加密的.m4s视频文件转换为标准MP4格式&#xff08;合并音视频流&#xff09;…...

vue2项目,为什么开发环境打包出来的js文件名是1.js 2.js,而生产环境打包出来的是chunk-3adddd.djncjdhcbhdc.js

Vue2项目开发环境与生产环境JS文件名差异的核心原理及配置逻辑如下&#xff1a; 一、文件名差异的底层机制 1‌、Webpack默认命名策略‌ 开发环境默认禁用哈希&#xff0c;采用[id].js命名规则&#xff08;如1.js&#xff09;&#xff0c;生产环境启用[chunkhash]生成chunk-xxx…...

SQL进阶知识:六、动态SQL

今天介绍下关于动态SQL的详细介绍&#xff0c;并结合MySQL数据库提供实际例子。 动态SQL是指在运行时动态构建和执行SQL语句的技术。这种技术在处理复杂的查询逻辑、参数化查询或在某些情况下需要根据用户输入动态调整查询时非常有用。MySQL支持动态SQL&#xff0c;主要通过PRE…...

Spring Boot常用注解详解:实例与核心概念

Spring Boot常用注解详解&#xff1a;实例与核心概念 前言 Spring Boot作为Java领域最受欢迎的快速开发框架&#xff0c;其核心特性之一是通过注解&#xff08;Annotation&#xff09;简化配置&#xff0c;提高开发效率。注解驱动开发模式让开发者告别繁琐的XML配置&#xff…...

java 富文本转pdf

前言&#xff1a; 本文的目的是将传入的富文本内容(html标签&#xff0c;图片)并且分页导出为pdf。 所用的核心依赖为iText7。 因为itextpdf-core的核心包在maven中央仓库中&#xff0c;阿里云华为云等拉不下来&#xff0c;中央仓库在外网&#xff0c;并且此包在中央仓库中未…...

17.第二阶段x64游戏实战-人工遍历二叉树结构

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;16.第二阶段x64游戏实战-分析二叉树结构 上一个内容里把二叉树的结构写了写&am…...

C#基于Sunnyui框架和MVC模式实现用户登录管理

C#基于Sunnyui框架和MVC模式实现用户登录管理 1 Controller1.1 UserManagementController.cs&#xff08;控制器入口&#xff09; 2 Model2.1 UserRepository.cs&#xff08;用户管理模型&#xff09;2.2 User.cs&#xff08;用户结构体&#xff09;2.3 SQLiteHelper.cs&#x…...

Spring Boot实战(三十六)编写单元测试

目录 一、什么是单元测试&#xff1f;二、Spring Boot 中的单元测试依赖三、举例 Spring Boot 中不同层次的单元测试3.1 Service层3.2 Controller 层3.3 Repository层 四、Spring Boot 中 Mock、Spy 对象的使用4.1 使用Mock对象的背景4.2 什么是Mock对象&#xff0c;有哪些好处…...

声音分离人声和配乐-从头设计数字生命第4课——仙盟创梦IDE

音频分离在数字人中具有多方面的重要作用&#xff0c;主要体现在以下几个方面&#xff1a; 提高语音合成质量&#xff1a;通过音频分离&#xff0c;可以将原始音频中的语音部分与其他背景噪音或干扰声音分离开来。这样在进行语音合成时&#xff0c;能够获得更纯净的语音信号&am…...

http协议、全站https

一、http协议 1、为何要学http协议? 用户用浏览器访问网页,默认走的都是http协议,所以要深入研究web层,必须掌握http协议 2、什么是http协议 1、全称Hyper Text Transfer Protocol(超文本传输协议) ### 一个请求得到一个响应包 普通…...

Mediamtx与FFmpeg远程与本地推拉流使用

1.本地推拉流 启服 推流 ffmpeg -re -stream_loop -1 -i ./DJI_0463.MP4 -s 1280x720 -an -c:v h264 -b:v 2000k -maxrate 2500k -minrate 1500k -bufsize 3000k -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/stream 拉流 ffplay -rtsp_transport tcp rtsp://43.136.…...

css3新特性第七章(3D变换)

css新特性第七章(3D变换) 一、3d空间和景深 元素进行 3D 变换的首要操作&#xff1a;父元素必须开启 3D 空间&#xff01; 使用 transform-style 开启 3D 空间&#xff0c;可选值如下&#xff1a; flat &#xff1a; 让子元素位于此元素的二维平面内&#xff08; 2D 空间&…...

redis经典问题

1.缓存雪崩 指缓存同一时间大面积的失效&#xff0c;所以&#xff0c;后面的请求都会落到数据库上&#xff0c;造成数据库短时间内承受大量请求而崩掉。 解决方案&#xff1a; 1&#xff09;Redis 高可用&#xff0c;主从哨兵&#xff0c;Redis cluster&#xff0c;避免全盘崩…...

数据仓库是什么?数据仓库架构有哪些?

目录 数据仓库是什么&#xff1f;数据仓库架构有哪些&#xff1f; 一、数据仓库是什么&#xff1f; 二、数据仓库的架构分层 1. 获取层 2. 数据层 3. 应用层 4. 访问层 三、数据仓库的价值体现 1.决策支持 2.业务优化 3.提升竞争力 四、数据仓库的未来发展趋势 总…...

Nginx 通过 Let‘s Encrypt 实现 HTTPS 访问全流程指南

一、Let’s Encrypt 与 Certbot 简介 Let’s Encrypt 是由非营利组织 ISRG 运营的免费证书颁发机构&#xff08;CA&#xff09;&#xff0c;旨在推动 HTTPS 的普及。其核心工具 Certbot 能自动化完成证书申请、部署与续期&#xff0c;大幅降低 HTTPS 的配置复杂度。通过 Certb…...

网络知识:路由器静态路由与动态路由介绍

目录 一、静态路由 1.1 什么是静态路由? 1.2 静态路由的好处 1.3 静态路由的局限 1.4 静态路由应用场景 微型办公室网络 性能要求高业务流量 安全性要求高的环境 二、动态路由 2.1 什么是动态路由? 2.2 动态路由的好处 2.3 动态路由的局限 2.4 动态路由的应用场…...