2023/9/13 -- C++/QT
作业:
1> 将之前定义的栈类和队列类都实现成模板类
栈:
#include <iostream>
#define MAX 40
using namespace std;template <typename T>
class Stack{
private:T *data;int top;
public:Stack();~Stack();Stack(const Stack &other);Stack &operator=(const Stack &other);//判空bool empty();//判满bool full();//获取栈的大小int size();//入栈void push();//出栈void pop();//获取栈顶元素T get_top();
};template <typename T>
Stack<T>::Stack():data(new T[MAX]),top(-1){cout<<"无参构造"<<endl;
}
template <typename T>
Stack<T>::~Stack(){delete []data;cout<<"析构函数"<<endl;
}
template <typename T>
Stack<T>::Stack(const Stack &other){top = other.top;data = new T[MAX];memcpy(data,other.data,sizeof(other.data[0])*(other.top+1));cout<<"拷贝构造"<<endl;
}
template <typename T>
Stack<T>&Stack<T>::operator=(const Stack &other){top = other.top;memcpy(data,other.data,sizeof(other.data[0])*(other.top+1));cout<<"拷贝赋值"<<endl;
}
//判空
template <typename T>
bool Stack<T>::empty(){return top == -1;
}
//判满
template <typename T>
bool Stack<T>::full(){return top == MAX-1;
}
//获取栈的大小
template <typename T>
int Stack<T>::size(){return top+1;
}
//入栈
template <typename T>
void Stack<T>::push(){if(full()){cout<<"栈满!入栈失败!"<<endl;return;}T value;cout<<"请输入入栈的元素:";cin>>value;top++;data[top] = value;cout<<value<<" 入栈成功"<<endl;
}
//出栈
template <typename T>
void Stack<T>::pop(){if(empty()){cout<<"栈空!出栈失败!"<<endl;return;}T temp = data[top--];cout<<temp<<" 出栈成功"<<endl;
}
//获取栈顶元素
template <typename T>
T Stack<T>::get_top(){return data[top];
}int main()
{Stack<int> s;s.push();s.push();s.push();cout<<"s.size = "<<s.size()<<endl;s.pop();cout<<"s.get_top = "<<s.get_top()<<endl;s.pop();s.pop();s.pop();return 0;
}
队列:
#include <iostream>
#define MAX 40
using namespace std;template<typename T>
class Queue{
private:T *data;int front;int back;
public:Queue();~Queue();Queue(const Queue &other);Queue &operator=(const Queue &other);//判空bool empty();//判满bool full();//获取队列大小int size();//入队void push();//出队void pop();
};
template <typename T>
Queue<T>::Queue():data(new T[MAX]),front(0),back(0){cout<<"无参构造"<<endl;
}
template <typename T>
Queue<T>::~Queue(){delete []data;cout<<"析构函数"<<endl;
}
template <typename T>
Queue<T>::Queue(const Queue &other){front = other.front;back = other.back;data = new T[MAX];memcpy(data,other.data,sizeof(other.data[0])*((other.back+MAX-other.front)%MAX));cout<<"拷贝构造"<<endl;
}
template <typename T>
Queue<T>&Queue<T>::operator=(const Queue &other){front = other.front;back = other.back;memcpy(data,other.data,sizeof(other.data[0])*((other.back+MAX-other.front)%MAX));cout<<"拷贝赋值"<<endl;
}
//判空
template <typename T>
bool Queue<T>::empty(){return front == back;
}
//判满
template <typename T>
bool Queue<T>::full(){return (back+1)%MAX == front;
}
//获取队列大小
template <typename T>
int Queue<T>::size(){return (back+MAX-front)%MAX;
}
//入队
template <typename T>
void Queue<T>::push(){if(full()){cout<<"队满!入队失败!"<<endl;return;}T value;cout<<"请输入要入队的元素:";cin>>value;data[back] = value;back = (back+1)%MAX;cout<<value<<" 入队成功"<<endl;
}
//出队
template <typename T>
void Queue<T>::pop(){if(empty()){cout<<"队空!出队失败!"<<endl;return;}T temp = data[front];front = (front+1)%MAX;cout<<temp<<" 出队成功"<<endl;
}int main()
{Queue<int> q;q.push();q.push();q.push();cout<<"q.size = "<<q.size()<<endl;q.pop();q.pop();q.pop();q.pop();cout<<"q.size = "<<q.size()<<endl;return 0;
}
2> 将继承和多态的课堂代码敲一遍
一、继承过程中的特殊成员函数
1.1 构造函数
1> 父子类中的构造函数不是同一个构造函数,父子类中拥有各自的构造函数
2> 需要在子类的构造函数初始化列表中,显性调用父类的有参构造完成对子类从父类中继承下来成员的初始化,否则系统会自动调用父类的无参构造来完成对其初始化,此时,如果父类中没有无参构造,则子类的构造函数会报错
3> 构造顺序:先构造父类再构造子类
1.2 析构函数
1> 父子类中会拥有各自的析构函数
2> 无需在子类的析构函数中显性调用父类的析构函数,当子类对象消亡时,系统会自动调用父类的析构函数,完成对子类从父类继承下来成员的内存回收工作,
3> 析构顺序:先析构子类再析构父类
1.3 拷贝构造
1> 父子类中拥有各自的拷贝构造函数
2> 需要在子类的拷贝构造函数初始化列表中,显性调用父类的拷贝构造函数完成对子类从父类中继承下来成员的初始化,如果没有显性调用父类的拷贝构造函数,系统会自动调用父类的无参构造来完成对其进行初始化工作,如果父类中没有无参构造,则子类的拷贝构造会报错
3> 如果父类中有指针成员指向堆区空间,则父类的拷贝构造需要使用深拷贝,如果子类有指针成员指向堆区空间,则子类需要使用深拷贝
1.4 拷贝赋值
1> 父子类中拥有给中的拷贝赋值函数
2> 需要在子类的拷贝赋值函数体内,显性调用父类的拷贝赋值函数,来完成对子类从父类中继承下来成员的赋值,如果没有显性调用父类的拷贝赋值函数,则系统啥也不干,子类从父类继承下来的成员的值保持不变。
3> 拷贝赋值也涉及深浅拷贝问题
二、多重继承
2.1 含义
所谓多重继承,就是可以由多个类共同派生出一个子类,该子类会继承所有父类的特征
2.2 继承格式
class 子类名:继承方式1 父类1,继承方式2 父类2,。。。,继承方式n 父类n
{//子类拓展成员
}
三、虚继承
3.1 菱形继承(钻石继承)问题
A --> 公共基类/ \B C --> 中间子类\ /D --> 汇聚子类
在继承过程中,由一个公共基类,派生出多个中间子类,再由这若干个子类的一部分共同派生出一个汇聚子类,就会导致汇聚子类中保留多份由公共基类传下来的成员,使得子类内存冗余、并且访问起来也比较麻烦
3.2 虚继承
1> 为了解决以上的菱形继承问题,我们可以引入虚继承:就是在生成中间子类时,在继承方式前加关键字virtual,那么,再由这些中间子类生成汇聚子类时,汇聚子类中就只保留一份公共基类传下来的数据
2> 一般的继承,需要在子类的构造函数初始化列表中,显性调用直接父类的构造函数,完成对继承下来成员的初始化。但是,在虚继承中,由于汇聚子类中只有一份公共基类的成员,不能确定由哪个直接父类对公共基类继承下来成员进行初始化,索性不使用直接父类对其进行初始化工作,直接调用公共基类的构造函数来完成对从公共基类中继承下来成员的初始化工作,如果没有显性调用公共基类的有参构造,那么系统会自动调用公共基类的无参构造完成初始化工作,此时,如果公共基类中没有无参构造,则汇聚子类的构造函数会报错。
#include <iostream>using namespace std;class A
{
protected:int value_a;
public:A() {cout<<"A::无参构造"<<endl;}A(int a):value_a(a) {cout<<"A::有参构造"<<endl;}
};//虚继承格式:再生成中间子类时,继承方式前加virtual关键字
class B:virtual public A
{
protected:int value_b;
public:B() {cout<<"B::无参构造"<<endl;}B(int a, int b):A(a), value_b(b){cout<<"B::有参构造"<<endl;}
};class C:virtual public A
{
protected:int value_c;
public:C() {cout<<"C::无参构造"<<endl;}C(int a, int c):A(a), value_c(c){cout<<"C::有参构造"<<endl;}
};//由中间子类生成汇聚子类
class D:public B, public C
{
private:int value_d;
public:D() {}D(int a1, int a2, int b, int c, int d):A(a2),B(a1,b), C(a2,c), value_d(d) {cout<<"D::有参构造"<<endl;}void show(){cout<<"value_b = "<<value_b<<endl;cout<<"value_c = "<<value_c<<endl;cout<<"value_d = "<<value_d<<endl;
// cout<<"value_a = "<<B::value_a<<endl;
// cout<<"value_a = "<<C::value_a<<endl;cout<<"value_a = "<<value_a<<endl;}
};
四、多态
4.1 概念
所谓多态,就是一种形式的多种状态,多态是实现泛型编程的重要部分,能够实现“一条语句多用”
泛型编程:试图以不变的程序执行可变的功能
4.2 多态实现条件
1> 继承:没有继承就没有多态
2> 虚函数:实现函数重写,保证父子类中使用同一个函数
3> 父类指针或引用指向子类对象,调用子类中重写的父类的虚函数
4.3 虚函数
1> C++中可以将成员函数定义成虚函数,定义格式:在定义成员函数前加关键字virtual
2> 作用:以保证父类空间能够寻找到子类中重写的跟父类函数原型相同的函数
4.4 虚函数的底层实现
4.5 虚析构函数
1> 引入目的:正确引导delete关键字,在释放父类指针空间时,将子类空间一并释放
2> 定义格式:在析构函数前面加关键字virtual
3> 如果类中某个函数设置成虚函数,那么该类的子子孙孙类中的该函数都是虚函数
4> 在特殊的成员函数中,只有析构函数能设置成虚函数
5> 在定义类的时候,要养成将析构函数定义成虚析构函数,以便于内存的管理工作
#include <iostream>using namespace std;class Father
{
protected:string name;int age;public:Father() {}Father(string n, int a):name(n), age(a) {cout<<"Father::有参构造"<<endl;}virtual ~Father() {cout<<"Father::析构函数"<<endl;}
};class Son:public Father
{
private:string toy;public:Son(){}Son(string n, int a, string t):Father(n,a), toy(t) {cout<<"Son::有参构造"<<endl;}~Son(){cout<<"Son::析构函数"<<endl;}
};int main()
{//定义父类指针,指向堆区的子类对象Father *p = new Son("张三", 18, "car");//释放堆区空间delete p;return 0;
}
4.6 纯虚函数
1> 引入背景:对于一个类而言,某些函数没有实现的必要,或者实现这些函数没有意义。定义这些函数,纯粹为了让子类对其进行重写,以便于后期可以使用父类的指针或引用指向子类对象,去调用子类中重写的该函数,此时就可以将该函数定义成纯虚函数
2> 纯虚函数的定义格式:将虚函数的函数体去掉,用=0进行替换:virtual 函数类型 函数名(形参列表) = 0;
3> 包含纯虚函数的类称为抽象类,抽象类不能实例化对象
4> 纯虚函数必须由子类进行重写,如果子类中没有重写纯虚函数,那么在子类中该函数还依然是纯虚函数,子类也是抽象类
#include <iostream>using namespace std;class Shape
{
protected:double perimeter;double area;public:Shape():perimeter(0), area(0) {}//定义两个虚函数virtual double get_p() = 0; //该函数就是纯虚函数virtual double get_a() = 0;};//定义圆形类
class Circle:public Shape
{
private:double radius;
public:Circle(double r = 0):radius(r){}//重写父类中提供的虚函数double get_a() override{area = 3.14*radius*radius;return area;}double get_p() override{perimeter = 2*radius*3.14;return perimeter;}
};//定义矩形类
class Rectangle:public Shape
{
private:double width;double height;
public:Rectangle(double w=0, double h=0):width(w), height(h){}//重写父类中提供的虚函数double get_a() override{area = width*height;return area;}double get_p() override{perimeter = 2*(width+height);return perimeter;}
};//定义全局函数输出给定图形的周长和面积
void show(Shape &s)
{cout<<"周长 = "<<s.get_p()<<" 面积 = "<<s.get_a()<<endl;//cout<<"周长 = "<<s.Shape::get_p()<<" 面积 = "<<s.Shape::get_a()<<endl;
}int main()
{//实例化一个圆形Circle c1(2);show(c1);Rectangle r1(3,4);show(r1);cout<<"*******************************"<<endl;//Shape s; //包含纯虚函数的类称为抽象类,抽象类不能实例化对象return 0;
}
五、泛型编程之模板(template)
模板是能够将数据类型进一步抽象,我们之前所接触的抽象,都是完成对数据的相关抽象
模板分为模板函数、模板类
5.1 模板函数
1> 程序员有时定义函数时,会因为函数参数类型不同,导致同一功能的函数需要定义多个,即使有函数重载,系统会自动匹配相应的函数,也会造成代码的冗余
2> C++提供函数模板机制:使用函数时,形参的类型也由实参进行传递,定义模板函数时,模板函数的参数,不仅能接收实参的值,也能接收实参的类型
3> 定义格式
template <typename 类型形参1,typename 类型形参2,。。。,typename 类型形参n>
函数返回值类型 函数名(形参列表){函数体内容}注意
template是定义模板的关键字
<>:中是类型的参数,用于接收实参传递的类型
typename:用于定义类型形参变量的,也可以使用class
函数体中,可以使用模板中的类型作为函数返回值、函数形参、局部变量的类型
4> 调用方式
1、隐式调用:调用时跟普通函数调用一样,系统会自动根据传进来的实参类型,推导出模板的类型参数
2、显式调用:在函数名后,实参括号前,加<>,传递类型形参的值,调用原则:尖找尖、圆找圆
3、一般模板函数要求显式调用
5> 注意事项
一个模板下面只能定义一个函数,如果要定义多个模板函数,需要定义多个模板
#include <iostream>using namespace std;//定义一个模板函数
template<typename T>
T sum(T m, T n)
{return m+n;
}//定义新的模板函数,不能多个模板函数共同使用一个模板
template<typename T>
T div(T m, T n)
{return m-n;
}int main()
{cout << sum<int>(3.3,5) << endl; //8 显式调用模板函数cout << sum(3.2,5.3) << endl; //8.5cout << sum(string("hello"),string("world")) << endl;return 0;
}
6> 模板函数的特化
当基础模板和特化模板同时出现时,如果是隐式调用,默认调用基础模板,如果是显式调用,则会调用特化模板
5.2 模板类
1> 引入背景:程序员有时定义类时,可能由于数据类型的不同,导致同样功能的类,需要定义多个,造成代码冗余问题
2> C++引入模板类,类中的一些类型可以是由调用时给定,由实参进行传递
3> 定义格式
template <typename 类型形参1,typename 类型形参2,。。。,typename 类型形参n>
class 类名
{//成员可以使用模板中的类型
};
4> 调用方式:只能显式调用,不能隐式调用
5> 在定义模板时,模板类外,但凡使用到类名,都需要重新再定义模板,并且使用类名时,需要给定类型
#include <iostream>using namespace std;template<typename T>
class Node
{
private:T data; //数据域Node *next; //指针域public:Node():next(NULL) {} //无参构造Node(T d):data(d), next(NULL){} //有参构造void show();};//在模板类外,但凡使用到模板类,都必须显性调用给定类型,需要重新定义模板
template <typename T>
void Node<T>::show()
{cout<<"data = "<<data<<endl;
}int main()
{Node<int> n1(520); //模板类的使用必须显性调用n1.show();Node<double> n2(3.14);n2.show();return 0;
}
相关文章:

2023/9/13 -- C++/QT
作业: 1> 将之前定义的栈类和队列类都实现成模板类 栈: #include <iostream> #define MAX 40 using namespace std;template <typename T> class Stack{ private:T *data;int top; public:Stack();~Stack();Stack(const Stack &ot…...

mybatis mapper.xml转建表语句
从网上下载了代码,但是发现没有DDL建表语句,只能自己手动创建了,感觉太麻烦,就写了一个工具类 将所有的mapper.xml放入到一个文件夹中,程序会自动读取生成建表语句 依赖的jar <dependency><groupId>org.d…...
封装使用Axios进行前后端交互
Axios是一个强大的HTTP客户端,用于在Vue.js应用中进行前后端数据交互。本文将介绍如何在Vue中使用Axios,并通过一个企业应用场景来演示其实际应用。 Axios简介 公众号:Code程序人生,个人网站:https://creatorblog.cn A…...
SOA、分布式、微服务
SOA: SOA是一种软件设计架构,用于构建分布式系统和应用程序。它将应用程序拆分为一系列松耦合的服务,这些服务通过标准化的接口进行通信,并能够以可编程方式组合和重用。SOA的目标是提高系统的灵活性、可扩展性和可维护性。 特点&…...
json数据传输压缩以及数据切片分割分块传输多种实现方法,大数据量情况下zlib压缩以及bytes指定长度分割
json数据传输压缩以及数据切片分割分块传输多种实现方法,大数据量情况下zlib压缩以及bytes指定长度分割。 import sys import zlib import json import mathKAFKA_MAX_SIZE 1024 * 1024 CONTENT_MIN_MAX_SIZE KAFKA_MAX_SIZE * 0.9def split_data(data):"&q…...

移动端APP测试-如何指定测试策略、测试标准?
制定项目的测试策略是一个重要的步骤,可以帮助测试团队明确测试目标、测试范围、测试方法、测试资源、测试风险等,从而提高测试效率和质量。本篇是一些经验总结,理论分享。并不是绝对正确的,也欢迎大家一起讨论。 文章目录 一、测…...

【Redis】深入探索 Redis 主从结构的创建、配置及其底层原理
文章目录 前言一、对 Redis 主从结构的认识1.1 什么是主从结构1.2 主从结构解决的问题 二、主从结构创建2.1 配置并建立从节点2.2.1 从节点配置文件2.2.2 启动并连接 Redis 主从节点2.2.3 SLAVEOF 命令2.2.4 断开主从关系 2.2 查看主从节点的信息2.2.1 INFO REPLICATION 命令2.…...

CSS 滚动驱动动画 scroll-timeline ( scroll-timeline-name ❤️ scroll-timeline-axis )
scroll-timelinescroll-timeline-name❤️scroll-timeline-axis 解决问题语法 animation-timeline-nameanimation-timeline-axis scroll-timeline ( scroll-timeline-name ❤️ scroll-timeline-axis ) 在 scroll() 的最后我们遇到了因为定位问题导致滚动效果失效的情况, 当…...

9.19号作业
2> 完成文本编辑器的保存工作 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QFontDialog> #include <QFont> #include <QMessageBox> #include <QDebug> #include <QColorDialog> #include <QColor&g…...

Mybatis学习笔记9 动态SQL
Mybatis学习笔记8 查询返回专题_biubiubiu0706的博客-CSDN博客 动态SQL的业务场景: 例如 批量删除 get请求 uri?id18&id19&id20 或者post id18&id19&id20 String[] idsrequest.getParameterValues("id") 那么这句SQL是需要动态的 还…...

element表格 和后台联调
1.配置接口 projectList:/api/goods/xxx,//产品列表2.请求接口(get请求默认参数page) // 产品列表 pageprojectList(params){return axios.get(base.projectList,{params})}3.获取数据 直接放到created里边去了 刷新页面就可以看到 async projectList(page){let res await t…...

基于SSM的智慧城市实验室主页系统的设计与实现
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用Vue技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…...

怒赞,阿里P8推荐的Java面试宝典:41个专题PDF(史上最全+面试必备)
《尼恩Java面试宝典》 40岁老架构师 尼恩 经过对大量 Java面试题 的不断梳理、迭代, 编著成5000页的《尼恩Java面试宝典》,致力于体系化, 系统化,形象化 梳理,形成一个大的知识体系,从而帮助大家 进大厂&a…...
线程池各个参数设置说明
1. corePoolSize 核心线程数 看处理业务属于IO密集型还是属于cpu密集型IO密集型: 通常设置为N1,还有一个计算公式:线程数 cpu数*(线程等待时间/线程总的处理时间) 但是由于服务器除了这个服务可能还部署有其他服务,…...

springBoot对接多个mq并且实现延迟队列---未完待续
mq调用流程 创建消息转换器 package com.wd.config;import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; import org.springframework.amqp.support.converter.MessageConverter; import org.springframework.context.annotation.Bean; import o…...

Pytorch从零开始实战04
Pytorch从零开始实战——猴痘病识别 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——猴痘病识别环境准备数据集模型选择模型训练数据可视化其他模型图片预测 环境准备 本文基于Jupyter notebook,使用Python3.8,Pytor…...

北大C++课后记录:文件读写的I/O流
前言 文件和平常用到的cin、cout流其实是一回事,可以将文件看作一个有限字符构成的顺序字符流,基于此,也可以像cin、cout读键盘数据那样对文件进行读写。 读写指针 输入流的read指针 输出流的write指针 注:这里的指针并不是普…...

详解Linux的grep命令
2023年9月19日,周二晚上 先写这么多吧,以后有空再更新,还要一些作业没写完.... 目录 概述查看grep命令的所有选项grep的常用选项选项-i选项-v选项-n选项-c编辑选项-l组合使用 概述 grep命令在Linux系统中是一个很重要的文本搜索工具和过…...

spark6. 如何设置spark 日志
spark yarn日志全解 一.前言二.开启日志聚合是什么样的2.1 开启日志聚合MapReduce history server2.2 如何开启Spark history server 三.不开启日志聚合是什么样的四.正确使用log4j.properties 一.前言 本文只讲解再yarn 模式下的日志配置。 二.开启日志聚合是什么样的 在ya…...
glibc: strlcpy
https://zine.dev/2023/07/strlcpy-and-strlcat-added-to-glibc/ https://sourceware.org/git/?pglibc.git;acommit;h454a20c8756c9c1d55419153255fc7692b3d2199 https://linux.die.net/man/3/strlcpy https://lwn.net/Articles/612244/ 从这里看,这个strlcpy、st…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...

实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...