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

C++学习

C++对C语言的加强

1.命名空间(namespace)

为了避免,在大规模程序的设计中,以及在程序员使用各种各样的C++库时,这些标识符的命名发送冲突。

标准C++引入了关键字namespace,可以更好地控制标识符的作用域。

std是C++标准命名空间,C++标准程序库中的所有标识符都被定义在std中,比如标准库中的类iostream、vector等都定义在该命名空间中,使用时要加上using声明(using namespace std)

C++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h

#include <iostream>using namespace std;int main()
{int a = 0;cout << "Hello World!" << endl;cin >> a;cout << "a= " << a << endl;return 0;
}

<<和>>表示数据的流向,cout表示屏幕,cin表示键盘输入

引用命名空间的三种方式

1.std::cout        std::endl

2.using std::cout           using std::cin

3.using namespace(该空间下的都可使用,上述两个是仅使用几个标识符)

命名空间的定义

namespace spaceA{int g_a = 11;
}int main()
{cout << spaceA::g_a << endl;return 0;
}

当命名空间嵌套时,要一直引用到最内层命名空间

namespace spaceB {int a;namespace spaceC{struct teacher{int id;char name[10];};}namespace spaceD{struct teacher{int id;char name[10];};}
}int main()
{using spaceB::spaceC::teacher;teacher t1;t1.id = 10;cout << t1.id << endl;return 0;
}

还有一种不常用的形式

namespace spaceB {int a;namespace spaceC{struct teacher{int id;char name[10];};}namespace spaceD{struct teacher{int id;char name[10];};}using namespace spaceC;
}int main()
{using spaceB::teacher;teacher t1;t1.id = 10;cout << t1.id << endl;return 0;
}

 2.对C的增强和bool类型

对全局变量的定义检测性增强

int g_val;
int g_val = 20;

该段代码在C语言中不会报错,但在C++中会重定义报错

报错的意义是int g_val和int g_val = 20分配的内存位置是不同的,int g_val分配的是内存的BSS段,BSS段用于存储未初始化的全局变量和静态变量。它的主要目的是节省存储空间,因为未初始化的变量在程序加载时不会占用实际的存储空间,只在运行时分配内存。int g_val = 20分配的是内存的data段,data段用于存放已初始化的全局变量和静态变量。它与BSS段不同,因为.data段在文件中占用实际的存储空间。以及搞驱动时要清楚变量放在内存的哪个区。


struct类型增强

struct student
{char name[10];int id;
};

声明完上述结构体类型后,C语言定义结构体类型需要struct student s1(除非使用typedef),C++定义结构体类型只需student s1(这里是把结构体当成一个类来处理了)

C++中所有变量和函数都必须有类型

C语言中的默认类型在C++中是不合法的

接收参数的个数错了直接报错,C语言是报警告

新增bool类型关键字

bool flag = true;
flag = false;

true ->1       false -> 0

非0即是1

sizeof(bool)的值为1

三目运算符的增强

int a = 10;
int b = 20;
(a<b)?a:b = 50;

上述代码,C语言会报错,C++会把a变成50,因为C语言返回的是值10,C++返回的是变量a

const的增强

const基础知识

int main(void)
{//const 定义常量--->const 意味只读const int a;int const b;//第一个第二个意思一样 代表一个常整形数const int *c;//第三个 c是一个指向常整形数的指针(所指向的内存数据不能被修改,但是本身可以修改)int * const d;//第四个 d 常指针(指针变量不能被修改,但是它所指向内存空间可以被修改)const int * const e ;//第五个 e一个指向常整形的常指针(指针和它所指向的内存空间,均不能被修改)return 0;
}
const int a = 10;
int *p = &a;
*p = 20;

上述代码C语言中a会被修改为20,而在C++中却不会,因为const常量是在text段的符号表中的一个键值对,其没有地址,而&a会创建一个临时空间让指针p指向该临时空间,对*p赋值也只是对折这段临时空间赋值

枚举的增强

c语言中枚举本质就是整型,枚举变量可以用任意整型赋值。而 c++中枚举变量,只能用被枚举出来的元素初始化。

3.引用

(1)基本概念

引用可以理解为一个变量的别名

引用数据类型:int &

int a = 10;
int &re = a;
re = 20;

a的值就变成了20 

引用的四个规则

1 .引用没有定义,是一种关系型声明。声明它和原有某一变量(实体)的关系。故而类型与原类型保持一致,且不分配内存。与被引用的变量有相同的地址。
2 .声明的时候必须初始化,一经声明,不可变更
3 . 可对引用,再次引用。多次引用的结果,是某一变量具有多个别名

4 . &符号前有数据类型时,是引用。其它皆为取地址

引用的应用

引用可以代替指针的一些简单使用

void change_value(int & r)
{r = 20
}int main()
{int a = 1;change_value(a);
}

a的值就改变为20了

(2)引用的本质

引用所占用的大小跟指针是相等的,引用的本质是一个常量指针

(3)引用作为函数的返回值

引用作为返回值,不要返回局部变量的引用

引用如果当函数返回值,函数可以当左值

int & A()
{static int a = 20;return a;
}int main()
{A() = 50;
}

a 的值就被修改为50了

(4)指针引用

struct teacher
{int id;char name[64];
};int get_mem(struct teacher * &tr)
{tr = (struct teacher *)malloc(sizeof(struct teacher));if (tr == NULL){return -1;}tp->id = 100;strcpy(tp->name,"zhang3");return 0;
}void free_mem(struct teacher * &tr)
{if (tr != NULL){free(tr);tr = NULL;}}

(5)const引用

如果想对一个常量进行引用,必须是一个const引用

对一个变量进行引用,可以是const引用,但这仅仅是不能通过引用来修改该变量,该变量还是可以变的

4.内联函数

特点
1)内联函数声明时inline关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求。
2)C++编译器直接将函数体插入在函数调用的地方

3)内联函数没有普通函数调用时的额外开销(压栈,跳转,返回)。

4)内联函数是一种特殊的函数,具有普通函数的特征(参数检查,返回类型等)
5)内联函数 由编译器处理,直接将编译后的函数体插入调用的地方宏代码片段

宏定义由 由预处理器处理,进行简单的文本替换,没有任何编译过程。
6)C++中内联编译的限制:

不能存在任何形式的循环语句

不能存在过多的条件判断语句

函数体不能过于庞大

不能对函数进行取址操作

函数内联声明必须在调用语句之前

7)编译器对于内联函数的限制并不是绝对的,内联函数相对于普通函数的优势只是省去了函数调用时压栈,跳转和返回的开销。因此,当函数体的执行开销远大于压栈,跳转和返回所用的开销时,那么内联将无意义。

适用场景:函数体很小,且被频繁使用的场景

5.函数的默认参数和占位参数

默认参数值要从右往左写

占位参数:

void fun(int x, int)
{cout << "a = " << a << endl;
}int main()
{fun(10,20);     //这里必须传递两个参数return 0;
}void fun(int x, int=0)
{cout << "a = " << a << endl;
}int main()
{fun(10,20);     //这里必须传递两个参数fun(25);        //这里可传一个可传两个return 0;
}

6.函数重载和函数指针

函数名相同,参数列表不同即为函数重载,返回值与函数重载无关

函数重载避免使用默认参数,避免产生函数歧义

根据调用时的参数列表来确定使用哪个函数

优先调用完全匹配的

没有完全匹配的,会隐式转换

都转换不了的,匹配失败


函数指针只指向一个重载函数,且只能指向参数匹配的一项

实际上在给函数指针赋值的时候,是会发生函数重载匹配的

在调用函数指针的时候,所调用的函数就已经固定了。

函数指针写法:

int fun(int a, int b)
{cout << "fun1" << endl;return 0;
}int main()
{int(*fp)(int, int) = NULL;fp = fun;fp(1,2);
}

7.类

(1)类的基本概念

class SuperHero
{
public:char name[64];int sex;void printHero(){cout << "name = " << name << endl;cout << "sex = " << sex << endl;}
};int main()
{    SuperHero Sp;strcpy(Sp.name, "Spiderman");Sp.sex = 1;Sp.printHero();return 0;
}

(2)类的封装特性

在public定义下的成员变量和成员方法。可以在类的内部和外部访问

在private定义下的成员变量和成员方法,只可以在类的内部访问

protected下的,在单个类中与private相同,在继承中不同

封装实现对外隐藏数据,对外提供接口

struct默认的访问控制权限是public,class默认的访问控制权限是private

(3)面向对象编程实例

(圆的周长和面积)

Circle类包含两个文件:Circle.h和Circle.cpp

Circle.h

#pragma onceclass Circle
{
public:void setR(double r);double getR();double getArea();double getGirth();
private:double m_r;double m_area;double m_girth;
};

Circle.cpp

#include "Circle.h"void Circle::setR(double r)
{m_r = r;
}double Circle::getR()
{return m_r;
}double Circle::getArea()
{m_area = 3.14 * m_r * m_r;return m_area;
}double Circle::getGirth()
{m_girth = 3.14 * m_r * 2;return m_girth;
}

main.cpp

#include <iostream>#include "Circle.h"
using namespace std;
int main()
{Circle c;c.setR(5);cout << c.getR() << endl;cout << c.getArea() << endl;cout << c.getGirth() << endl;return 0;
}

(比较两立方体是否相等)

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;class Cube
{
public:void setABC(int a,int b,int c){m_a = a;m_b = b;m_c = c;}double getArea(){return (m_a * m_b) * 2 + (m_a * m_c) * 2 + (m_c * m_b) * 2;}double getVolume(){return m_a * m_b * m_c;}//同类之间无私处bool judgeCube(Cube another){if (m_a == another.m_a && m_b == another.m_b&& m_c == another.m_c){return true;}else{return false;}}
private:double m_a;double m_b;double m_c;
};int main()
{Cube c1, c2;c1.setABC(10, 20, 30);c2.setABC(10, 20, 30);if (c1.judgeCube(c2)){cout << "相等" << endl;}else{cout << "不相等" << endl;}return 0;
}

(判断点是否在圆内)

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;class Point
{
public:void setXY(double x, double y){m_x = x;m_y = y;}double getX(){return m_x;}double getY(){return m_y;}
private:double m_x;double m_y;
};class AdvCircle
{
public:void setXYR(double x, double y, double r){m_x = x;m_y = y;m_r = r;}double getX(){return m_x;}double getR(){return m_r;}double getY(){return m_y;}
private:double m_r;double m_x;double m_y;
};void judgeposition(AdvCircle & c, Point & p)
{if (((p.getX() - c.getX()) * (p.getX() - c.getX()) + (p.getY() - c.getY()) * (p.getY() - c.getY())) > (c.getR()) * c.getR()){cout << "点在圆外" << endl;}else if (((p.getX() - c.getX()) * (p.getX() - c.getX()) + (p.getY() - c.getY()) * (p.getY() - c.getY())) < (c.getR()) * c.getR()){cout << "点在圆内" << endl;}else{cout << "点在圆上" << endl;}
}int main()
{AdvCircle c1;Point p1;c1.setXYR(1, 1, 2);p1.setXY(0, 0);judgeposition(c1, p1);
}

 也可把方法写入点中或圆中均可,也可多文件编写

(4)

作业1:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include <math.h>
class Point
{
public:void setXY(double x, double y){m_x = x;m_y = y;}double getX(){return m_x;}double getY(){return m_y;}double distance(Point& another){double d = sqrt((m_x - another.m_x) * (m_x - another.m_x) + (m_y - another.m_y) * (m_y - another.m_y));return d;}
private:double m_x;double m_y;
};class Circle
{
public:void setXY(double x, double y){m_p.setXY(x, y);}void setR(double r){m_r = r;}double getX(){return m_p.getX();}double getY(){return m_p.getY();}double getR(){return m_r;}bool isIntersect(Circle another){double Inter = m_p.distance(another.m_p);if ( Inter >= abs(m_r-another.m_r) && Inter <= m_r + another.m_r){return true;}else{return false;}}
private:Point m_p;double m_r;
};int main()
{Circle c1, c2;double x, y, r;cout << "请输入第一个圆的圆心:" << endl;cin >> x;cin >> y;cout << "请输入第一个圆的半径:" << endl;cin >> r;c1.setXY(x, y);c1.setR(r);cout << "请输入第二个圆的圆心:" << endl;cin >> x;cin >> y;cout << "请输入第二个圆的半径:" << endl;cin >> r;c2.setXY(x, y);c2.setR(r);if (c1.isIntersect(c2)){cout << "两圆相交" << endl;}else{cout << "两圆不相交" << endl;}return 0;}

 作业2:

class Rectangle
{
public:void setLeft(double x, double y){Left_lower.setXY(x, y);}void setRight(double x, double y){Right_upper.setXY(x, y);}double getArea(){double Area = (Right_upper.getX() - Left_lower.getX()) * (Right_upper.getY() - Left_lower.getY());return Area;}
private:Point Left_lower;Point Right_upper;
};int main()
{Rectangle R1;R1.setLeft(1, 1);R1.setRight(4, 3);cout << R1.getArea() << endl;return 0;}

作业3:

class Tree
{
public:void setAges(int ages){m_ages = ages;}void grow(int years){m_ages = m_ages += years;}void age(){cout << m_ages << endl;}
private:int m_ages = 0;
};int main()
{Tree t1;t1.age();t1.setAges(12);t1.age();t1.grow(7);t1.age();return 0;}

8.对象的构造和析构

(1)构造

构造函数是C++给类提供的一个给对象的初始化方案

类中可以定义与类名同名的成员函数,这就是构造函数

class Test
{
public:Test(){m_x = 0;m_y = 0;}Test(int x){m_x = x;m_y = 0;}Test(int x, int y){m_x = x;m_y = y;}
private:int m_x;int m_y;
};int main()
{Test t1;                //这里用的是Test()构造函数Test t1(10);            //这里用的是Test(int x)构造函数Test t1(10, 20);        这里用的是Test(int x, int y)构造函数return 0;
}

构造函数是可以重载的,无参的就是默认构造函数

(2)析构

析构函数是在类对象销毁时操作系统自动调用的,析构函数没有形参,析构函数不能重载

class Test
{
public:Test(){m_x = 0;m_y = 0;name = char(*)malloc(100);}Test(int x){m_x = x;m_y = 0;}Test(int x, int y){m_x = x;m_y = y;}~Test(){if (name != NULL){free(name);cout << "free succ" << endl; }}
private:int m_x;int m_y;char *name;
};void test()
{Test t1; 
}    //t1被销毁时就会调用~Test();int main()
{test();
}

(3)拷贝构造函数

class Test
{
public:Test(){m_x = 0;m_y = 0;}Test(int x){m_x = x;m_y = 0;}Test(int x, int y){m_x = x;m_y = y;}void printT(){cout << "x = " << m_x << "  , y = " << m_y << endl;}Test(const Test& another){cout << "Test拷贝" << endl;m_x = another.m_x;m_y = another.m_y;}private:int m_x;int m_y;
};int main()
{Test t1(10, 20);Test t2(t1);t2.printT();return 0;
}

如果不写拷贝构造函数,默认拷贝构造函数就是将变量一一赋值

注意构造函数都是初始化时,创建类对象时调用的,如果是如下写法:

Test t1(13,25);
Test t2;
t2 = t1;

这里t2=t1调用的不是拷贝构造函数,而是赋值操作符函数operator=

(4)深拷贝和浅拷贝

使用默认拷贝函数是浅拷贝,t2和t1的m_name指向同一内存空间,析构时会free两次,导致系统崩溃

class Teacher
{
public:Teacher(int id,const char *name){m_id = id;int len = strlen(name);m_name = (char*)malloc(len + 1);strcpy(m_name, name);}void printT(){cout << "id = " << m_id << ", name = " << m_name;}~Teacher(){if (m_name != NULL){free(m_name);m_name = NULL;}}
private:int m_id;char* m_name;
};int main()
{Teacher t1(1, "zhang3");Teacher t2(t1);t1.printT();return 0;
}

有指针就要自行进行深拷贝

using namespace std;class Teacher
{
public:Teacher(int id,const char *name){m_id = id;int len = strlen(name);m_name = (char*)malloc(len + 1);strcpy(m_name, name);}void printT(){cout << "id = " << m_id << ", name = " << m_name;}Teacher(const Teacher& another){m_id = another.m_id;int len = strlen(another.m_name);m_name = (char*)malloc(len + 1);strcpy(m_name, another.m_name);}~Teacher(){if (m_name != NULL){free(m_name);m_name = NULL;}}
private:int m_id;char* m_name;
};int main()
{Teacher t1(1, "zhang3");Teacher t2(t1);t1.printT();return 0;
}

(5)构造函数的初始化列表

class ABC
{
public:ABC(int a, int b, int c){m_a = a;m_b = b;m_c = c;}~ABC(){cout << "~ABC()" << endl;}
private:int m_a;int m_b;int m_c;
};class ABCDE
{
public:ABCDE(int a, int b, int c, int d, int e) :m_abc(a, b, c), m_e(e)    //调用有参构造{m_d = d;}                                                ABCDE(ABC& abc, int d, int e) :m_abc(abc), m_e(e)    //调用拷贝构造{m_d = d;}
private:ABC m_abc;int m_d;const int m_e;
};int main()
{ABC abc(10, 20, 30);ABCDE abcde1(11, 22, 33, 44, 55);ABCDE abcde2(abc, 66, 77);return 0;
}

9.对象动态建立和释放new和delete

用来代替mallocfree

new和delete是运算符不是函数,所以运行效率高

语法:

int *array_p = new int[10];
delete[] array_p;int *p = new int;
delete p;

区别:

class Test
{
public:Test(int a, int b){m_a = a;m_b = b;}
private:int m_a;int m_b;
};int main()
{Test *tp = new Test(10,20);if ( tp != NULL ){delete tp;tp = NULL;}return 0;
}

new可以调用构造方法来初始化,而malloc不行

delete可以自动调用类对象的析构函数,而free不会调用

10.static修饰的成员变量和成员函数

1,static 成员变量实现了同类对象间信息共享。
2,static 成员类外存储,求类大小,幷不包含在內。
3,static 成员是命名空间属于类的全局变量,存储在 data 区。
4,static 成员只能类外初始化。
5,可以通过类名访问(无对象生成时亦可),也可以通过对象访问。

应用:

class Student
{
public:Student(int id, double score){m_id = id;m_score = score;m_count++;sum_score += m_score;}static int getCount(){return m_count;}static double getAver(){return sum_score / m_count;}~Student(){m_count--;sum_score -= m_score;}
private:int m_id;double m_score;static int m_count;static double sum_score;
};int Student::m_count = 0;
double Student::sum_score = 0.0;int main()
{Student a1(1, 85);Student a2(2, 86);Student a3(3, 92);Student a4(4, 73);Student a5(5, 55);cout << "学生人数为:" << Student::getCount() << endl;cout << "平均分为:" << Student::getAver() << endl;
}

相关文章:

C++学习

C对C语言的加强 1.命名空间&#xff08;namespace&#xff09; 为了避免&#xff0c;在大规模程序的设计中&#xff0c;以及在程序员使用各种各样的C库时&#xff0c;这些标识符的命名发送冲突。 标准C引入了关键字namespace&#xff0c;可以更好地控制标识符的作用域。 st…...

Linux Mem -- Where the mte store and check in the real hardware platform

目录 1 前言 2 MTE tag分类 3 Address tag 4 Memory tag 5 Tag Check 6 Cortex-A710 和 CI-700 系统示例&#xff1a; 1 前言 ARM的MTE允许分配、设置、比较一个 4bit的allocation tag 为16字节粒度的物理地址。当对MTE有一定了解后&#xff0c;应该会产生如下疑问&#…...

老牌软件,如今依旧坚挺

今天给大家介绍一个非常好用的老牌电脑清理软件&#xff0c;这个软件好多年之前就有人使用了。 今天找出来之后&#xff0c;发现还是那么的好用&#xff0c;功能非常强大。 Red Button 电脑清理软件 软件是绿色版&#xff0c;无需安装&#xff0c;打开这个图标就能直接使用了…...

springboot整合modbus实现通讯

springboot整合modbus4j实现tcp通讯 前言 本文基于springboot和modbus4j进行简单封装&#xff0c;达到开箱即用的目的&#xff0c;目前本方案仅实现了tcp通讯。代码会放在最后&#xff0c;按照使用方法操作后就可以直接使用 介绍 在使用本方案之前&#xff0c;有必要对modb…...

【java面试】线程篇

1.什么是线程&#xff1f; 线程是操作系统能够进行运算调度的最小单位&#xff0c;它被包含在进程之中&#xff0c;是进程中的实际运作单位。 2.线程和进程有什么区别&#xff1f; 线程是进程的子集&#xff0c;一个进程可以有很多线程&#xff0c;每条线程并行执行不同的任…...

DeepSeek官方发布R1模型推荐设置

今年以来&#xff0c;DeepSeek便在AI领域独占鳌头&#xff0c;热度一骑绝尘。其官方App更是创造了惊人纪录&#xff0c;成为史上最快突破3000万日活的应用&#xff0c;这一成绩无疑彰显了它在大众中的超高人气与强大吸引力。一时间&#xff0c;各大AI及云服务厂商纷纷投身其中&…...

Vue CLI 配置与插件

Vue CLI 配置与插件 今天我们来聊聊 Vue CLI 的配置与插件。随着项目复杂度的增加&#xff0c;合理配置 Vue CLI 可以帮助我们更高效地管理项目&#xff0c;同时利用插件机制快速集成各种功能。下面我就和大家详细介绍如何配置 Vue CLI&#xff0c;以及如何使用和开发插件&…...

Spring Boot (maven)分页3.0版本 通用版

前言&#xff1a; 通过实践而发现真理&#xff0c;又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识&#xff0c;又从理性认识而能动地指导革命实践&#xff0c;改造主观世界和客观世界。实践、认识、再实践、再认识&#xff0c;这种形式&#xff0c;循环往…...

pip 与 conda 的故事

pip 换源 pip 官方源 -i https://pypi.python.org/simple pip 清华源 -i https://pypi.tuna.tsinghua.edu.cn/simple pip 阿里源 -i https://mirrors.aliyun.com/pypi/simple PyTorch 安装 pip3 install torch torchvision torchaudio pip3 install torch torchvision torchaud…...

清华大学KVCache.AI团队联合趋境科技联合的KTransformers开源项目为什么那么厉害

KTransformers是一个由清华大学KVAV.AI团队开发的开源项目&#xff0c;旨在优化大语言模型&#xff08;LLM&#xff09;的推理性能&#xff0c;特别是在有限显存资源下运行大型模型。以下是KTransformers的详细介绍&#xff1a; 1. 核心特点 高性能优化&#xff1a;KTransfor…...

DeepSeek 遭 DDoS 攻击背后:DDoS 攻击的 “千层套路” 与安全防御 “金钟罩”_deepseek ddos

当算力博弈升级为网络战争&#xff1a;拆解DDoS攻击背后的技术攻防战——从DeepSeek遇袭看全球网络安全新趋势 在数字化浪潮席卷全球的当下&#xff0c;网络已然成为人类社会运转的关键基础设施&#xff0c;深刻融入经济、生活、政务等各个领域。从金融交易的实时清算&#xf…...

4090单卡挑战DeepSeek r1 671b:尝试量化后的心得的分享

引言&#xff1a; 最近&#xff0c;DeepSeek-R1在完全开源的背景下&#xff0c;与OpenAI的O1推理模型展开了激烈竞争&#xff0c;引发了广泛关注。为了让更多本地用户能够运行DeepSeek&#xff0c;我们成功将R1 671B参数模型从720GB压缩至131GB&#xff0c;减少了80%&#xff…...

【动态路由】系统Web URL资源整合系列(后端技术实现)【apisix实现】

需求说明 软件功能需求&#xff1a;反向代理功能&#xff08;描述&#xff1a;apollo、eureka控、apisix、sentinel、普米、kibana、timetask、grafana、hbase、skywalking-ui、pinpoint、cmak界面、kafka-map、nacos、gateway、elasticsearch、 oa-portal 业务应用等多个web资…...

【Elasticsearch】通过运行时字段在查询阶段动态覆盖索引字段

在 Elasticsearch 中&#xff0c;Override field values at query time是指通过运行时字段&#xff08;runtime fields&#xff09;在查询阶段动态覆盖索引字段的值&#xff0c;而无需修改原始索引数据。这种功能特别适用于以下场景&#xff1a; 1. 动态修改字段值&#xff1a…...

【stm32】定时器

stm32f4xx&#xff1a; APB2 ----> TIM1,TIM8,TIM9,TIM10,TIM11 APB1 ----> TIM2,TIM3,TIM4,TIM5,TIM6,TIM7,TIM12,TIM13,TIM14 一、定时器介绍 1、基本定时器 1.1、TIM6 和 TIM7 的主要特性 ● 16 位自动重载递增计数器 ● 16 位可编程…...

滑动窗口算法篇:连续子区间与子串问题

1.滑动窗口原理 那么一谈到子区间的问题&#xff0c;我们可能会想到我们可以用我们的前缀和来应用子区间问题&#xff0c;但是这里对于子区间乃至子串问题&#xff0c;我们也可以尝试往滑动窗口的思路方向去进行一个尝试&#xff0c;那么说那么半天&#xff0c;滑动窗口是什么…...

华三交换机-链路聚合配置案例

目录 1.链路聚合简述:2.链路聚合的作用:3.链路聚合的模式:4.网络拓扑:5.实验需求:6.网络配置&#xff1a;6.1 链路聚合配置(静态聚合)6.1.1 链路聚合配置:6.1.2 查看链路聚合状态: 6.2 链路聚合配置(动态聚合)6.2.1 链路聚合配置:6.2.2 查看链路聚合状态: 7.网络连通性测试:(接…...

Qwen2-VL 的重大省级,Qwen 发布新旗舰视觉语言模型 Qwen2.5-VL

Qwen2.5-VL 是 Qwen 的新旗舰视觉语言模型&#xff0c;也是上一代 Qwen2-VL 的重大飞跃。 Qwen2.5-VL主要特点 视觉理解事物&#xff1a;Qwen2.5-VL不仅能够熟练识别花、鸟、鱼、昆虫等常见物体&#xff0c;而且还能够分析图像中的文本、图表、图标、图形和布局。 代理性&…...

关系数据库标准语言SQL

1.SOL称为结构化查询语言&#xff0c;它是由1974年由Boyce和Chamberlin提出的&#xff0c;1975年至1979年IBM公司的San Jose Research Laboratory研制了关系数据库管理系统的原型系统SystemR,并实现了这种语言。 2.SQL(Structured Ouery Language)称为结构化查询语言 3.SQL数…...

mysql8.0使用MGR实现高可用与利用MySQL Router构建读写分离MGR集群

MGR是MySQL Group Replication的缩写&#xff0c;即MySQL组复制。 在以往&#xff0c;我们一般是利用MySQL的主从复制或半同步复制来提供高可用解决方案&#xff0c;但这存在以下几个比较严重的问题&#xff1a; 主从复制间容易发生复制延迟&#xff0c;尤其是在5.6以前的版本…...

《AI大模型开发笔记》MoE模型技术对比(Mixtral,Qwen2-MoE,DeepSeek-v3)

MoE模型技术对比(Mixtral,Qwen2-MoE,DeepSeek-v3) MoE(混合专家)大模型进入爆发期!本期我们对比三大开源MoE LLM:Mixtral、Qwen2-MoE 和最新爆火的 DeepSeek-V3。从 2023 年 Mixtral 开启风潮,到 2024 年 DeepSeek-V3 让全球瞩目,MoE 模型到底经历了怎样的进化? De…...

Vue.js 组件开发深入解析:Vue 2 vs Vue 3

Vue.js 是一个渐进式框架&#xff0c;旨在通过声明式渲染和组件化开发来提高开发效率和可维护性。组件是 Vue 应用的基本组成部分&#xff0c;几乎所有的功能都可以通过组件来实现。随着 Vue 3 的发布&#xff0c;Vue.js 引入了许多新的特性&#xff0c;使得组件的开发变得更加…...

DeepSeek大模型一键部署解决方案:全平台多机分布式推理与国产硬件优化异构计算私有部署

DeepSeek R1 走红后&#xff0c;私有部署需求也随之增长&#xff0c;各种私有部署教程层出不穷。大部分教程只是简单地使用 Ollama、LM Studio 单机运行量化蒸馏模型&#xff0c;无法满足复杂场景需求。一些操作配置也过于繁琐&#xff0c;有的需要手动下载并合并分片模型文件&…...

多个用户如何共用一根网线传输数据

前置知识 一、电信号 网线&#xff08;如以太网线&#xff09;中传输的信号主要是 电信号&#xff0c;它携带着数字信息。这些信号用于在计算机和其他网络设备之间传输数据。下面是一些关于网线传输信号的详细信息&#xff1a; 1. 电信号传输 在以太网中&#xff0c;数据是…...

DeepSeek官方推荐的AI集成系统

DeepSeek模型虽然强大先进&#xff0c;但是模型相当于大脑&#xff0c;再聪明的大脑如果没有输入输出以及执行工具也白搭&#xff0c;所以需要有配套工具才能让模型发挥最大的作用。下面是一个典型AI Agent架构图&#xff0c;包含核心组件与数据流转关系&#xff1a; #mermaid-…...

el-select 添加icon

Element-ui-plus 新版本&#xff1a;Select 选择器 | Element Plus 要实现如上的效果 &#xff0c;要用到具名插槽 prefix&#xff0c;看代码&#xff1a; <template><el-dialog ref"dialogRef" v-model"dialogVisible" :title"title"…...

Qt的QPushButton样式设置

在Qt中&#xff0c;可以通过样式表&#xff08;QSS&#xff09;为QPushButton设置丰富的样式。以下是常见样式设置方法的详细说明&#xff1a; 1. 基础样式 // 设置背景色、文字颜色、圆角边框 button->setStyleSheet("QPushButton {"" background-color…...

Java函数计算冷启动从8s到800ms的优化实录

在函数计算场景中,冷启动性能对用户体验至关重要。本文将分享如何将 Java 函数计算的冷启动时间从 8 秒优化到 800 毫秒,包括具体的技术手段和代码示例。 一、背景介绍 函数计算是一种事件驱动的计算服务,用户只需上传代码,无需管理服务器。但在实际使用中,函数计算的冷…...

通过例子学 rust 个人精简版 1-1

1-1 Hello World fn main() {println!("Hello World!");// 动手试一试println!("Im a Rustacean!"); }Hello World! Im a Rustacean!要点1 &#xff1a;println 自带换行符 注释 fn main() {let x 5 /* 90 */ 5;println!("Is x 10 or 100? x …...

STM32、GD32驱动TM1640原理图、源码分享

一、原理图分享 二、源码分享 /************************************************* * copyright: * author:Xupeng * date:2024-07-18 * description: **************************************************/ #include "smg.h"#define DBG_TAG "smg&…...

Centos安装php-8.0.24.tar

查看系统环境 cat /etc/redhat-release 预先安装必要的依赖 yum install -y \ wget \ gcc \ gcc-c \ autoconf \ automake \ libtool \ make \ libxml2 \ libxml2-devel \ openssl \ openssl-devel \ sqlite-devel yum update 1、下载解压 cd /data/ wget https:/…...

VNC远程控制Mac

前言 macOS系统自带有VNC远程桌面&#xff0c;我们可以在控制端上安装配置VNC客户端&#xff0c;以此来实现远程控制macOS。但通常需要在不同网络下进行远程控制&#xff0c;为此&#xff0c;我们可以在macOS被控端上使用cpolar做内网穿透&#xff0c;映射VNC默认端口5…...

基于大数据的北京市天气数据分析系统的设计与实现

【Flask】基于Flask的北京市天气数据分析系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统采用Python和Flask框架&#xff0c;结合Pandas、NumPy等数据处理库及Echarts进…...

20250214在ubuntu20.04下使用obs studio录制外挂的1080p的USB摄像头【下载安装】

20250214在ubuntu20.04下使用obs studio录制外挂的1080p的USB摄像头 2025/2/14 9:10 缘起&#xff1a;笔记本电脑在ubuntu20.04下使用Guvcview录制自带的摄像头&#xff0c;各种问题。 1、降帧率。WIN10/11自带的相机应用可以满速30fps&#xff0c;马上重启到ubuntu20.04&#…...

OpenEuler学习笔记(三十):在OpenEuler上搭建3D建模环境

在OpenEuler上搭建3D建模环境&#xff0c;通常可以选择一些常见的3D建模软件&#xff0c;如Blender、FreeCAD等。以下以搭建Blender和FreeCAD这两款软件的使用环境为例&#xff0c;为你详细介绍搭建步骤。 搭建Blender 3D建模环境 1. 更新系统软件包 首先&#xff0c;确保系…...

Deepseek R1模型本地化部署+API接口调用详细教程:释放AI生产力

文章目录 前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装ollama2部署DeepSeek R1模型删除已存在模型&#xff0c;以7b模型为例 三、DeepSeek API接口调用Cline配置 前言 随着最近人工智能 DeepSeek 的爆火&#xff0c;越来越多的技术大佬们开始关注如…...

Ubuntu添加桌面快捷方式

以idea为例 一. 背景 在ubuntu中&#xff0c;很多时候是自己解压的文件并没有桌面快捷方式&#xff0c;需要自己找到对应的目录的执行文件手动打开&#xff0c;很麻烦 而只需要在 /usr/share/applications 中创建自定义的desktop文件就能自动复制到桌面 二. 添加方法 创建desk…...

教程:使用 Vue 3 和 arco 实现表格合并

1. 功能概述 本教程将介绍如何使用 Vue 3 和 arco 组件库实现表格合并功能。具体来说&#xff0c;我们会根据表格数据中的某个字段&#xff08;如 type&#xff09;对表格的某一列&#xff08;如入库类型列&#xff09;进行合并&#xff0c;同时将质检说明列合并为一列。 2. …...

【MySQL数据库】Ubuntu下的mysql

目录 1&#xff0c;安装mysql数据库 2&#xff0c;mysql默认安装路径 3&#xff0c;my.cnf配置文件? 4&#xff0c;mysql运用的相关指令及说明 5&#xff0c;数据库、表的备份和恢复 mysql是一套给我们提供数据存取的&#xff0c;更加有利于管理数据的服务的网络程序。下…...

Java实现MinIO上传PDF文件并配置浏览器在线打开而非下载

在Minio中上传PDF文件后&#xff0c;通常文件的访问方式&#xff08;即URL&#xff09;是配置为允许下载文件的&#xff0c;因为大多数Web服务器和存储服务默认将PDF文件视为应下载的内容类型&#xff08;Content-Type: application/pdf&#xff09;。但是&#xff0c;如果你想…...

CSV格式和普通EXCEL格式文件的区别

CSV 文件&#xff08;.csv&#xff09; 普通的 Excel 文件&#xff08;.xlsx 或 .xls) 主要体现在 文件格式、数据存储、功能支持 等方面: 文件格式 比较项CSV 文件 (.csv)Excel 文件 (.xlsx/.xls)文件类型纯文本文件二进制或 XML 格式数据分隔逗号&#xff08;,&#xff09…...

安卓基础(持续更新的笔记)

为什么要这样&#xff1a; // 创建请求体RequestBody body RequestBody.create(MediaType.parse("application/json; charsetutf-8"),jsonObject.toString()); jsonObject 就包含了一个 JSON 数据&#xff0c;它其实就是&#xff1a; {"name": "张…...

大模型Deepseek的使用_基于阿里云百炼和Chatbox

目录 前言1. 云服务商2. ChatBox参考 前言 上篇博文中探索了&#xff08;本地&#xff09;部署大语言模型&#xff0c;适合微调、数据高隐私性等场景。随着Deepseek-R1的发布&#xff0c;大语言模型的可及性得到极大提升&#xff0c;应用场景不断增加&#xff0c;对高可用的方…...

数学建模基础训练-1:概念解析

文章目录 数学建模基础训练-1&#xff1a;概念解析问题一&#xff1a;如何找到“概念”&#xff1f;问题二&#xff1a;如何全面理解概念的基础含义&#xff1f;问题三&#xff1a;如何深刻理解概念并作出创新点发掘&#xff1f;实际举例问题一 :研究并给出寒假开学某大学返校交…...

【mybatis】基本操作:详解Spring通过注解和XML的方式来操作mybatis

mybatis 的常用配置 配置数据库连接 #驱动类名称 spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver #数据库连接的url spring.datasource.urljdbc:mysql://127.0.0.1:3306/mybatis_test characterEncodingutf8&useSSLfalse #连接数据库的名 spring.datasourc…...

联邦学习中的“参数聚合“机制详解:医疗数据隐私保护的技术实现路径

一、技术原理&#xff1a;参数聚合的数学本质 1.1 核心数学公式 联邦平均算法&#xff08;FedAvg&#xff09;&#xff1a; \theta_{global}^{t1} \sum_{k1}^K \frac{n_k}{N} \theta_k^t其中&#xff1a; K K K&#xff1a;参与本轮训练的客户端数量 n k n_k nk​&#xff…...

LVS 负载均衡集群(NAT模式)

一、环境准备 四台主机&#xff08;一台 LVS、两台 RS、一台客户端&#xff09; 注意每个虚拟机都需要关闭防火墙和 selinux 1.1.LVS 主机 LVS 主机&#xff08;两块网卡&#xff09; 第一块&#xff1a;NAT模式&#xff08;内网&#xff09; 第二块&#xff1a;添加网卡&am…...

Rocky Linux系统修改网卡全攻略

Rocky Linux系统修改网卡全攻略 Rocky Linux系统修改网卡全攻略一、了解网卡相关知识二、查看当前网卡配置(一)使用ip命令(二)使用ifconfig命令(需安装)三、修改网卡配置文件(一)修改IP地址(二)修改网关和DNS服务器(三)保存并退出配置文件四、重启网络服务使配置生…...

常用查找算法整理(顺序查找、二分查找、哈希查找、二叉排序树查找、平衡二叉树查找、红黑树查找、B树和B+树查找、分块查找)

常用的查找算法&#xff1a; 顺序查找&#xff1a;最简单的查找算法&#xff0c;适用于无序或数据量小的情况&#xff0c;逐个元素比较查找目标值。二分查找&#xff1a;要求数据有序&#xff0c;通过不断比较中间元素与目标值&#xff0c;将查找范围缩小一半&#xff0c;效率…...

自动化办公|xlwings 数据类型和转换

xlwings 数据类型和转换&#xff1a;Python 与 Excel 的桥梁 在使用 xlwings 进行 Python 和 Excel 数据交互时&#xff0c;理解两者之间的数据类型对应关系至关重要。本篇将详细介绍 Python 数据类型与 Excel 数据类型的对应关系&#xff0c;以及如何进行数据类型转换。 一、…...