C++初阶-模板初阶
目录
1.泛型编程
2.函数模板
2.1函数模板概念
2.2实现函数模板
2.3模板的原理
2.4函数模板的实例化
2.4.1隐式实例化
2.4.2显式初始化
2.5模板参数的匹配原则
3.类模板
3.1类模板定义格式
3.2类模板的实例化
4.总结
1.泛型编程
对广泛的类型法写代码,我们之前写的是一个专用的类型,如果想要用其他类型就要再写一个专用的函数写这个功能和实现方式与其他的差不多的代码,非常麻烦,如:
//交换两个整型
void Swap(int& a, int& b)
{int c = a;a = b;b = c;
}
//交换两个浮点型
void Swap(double& a, double& b)
{double c = a;a = b;b = c;
}
我们可以发现,如果我们把第一个函数的int 改为double就可以直接变为第二个函数了,这样写起来很费时间,而且如果我们这个函数只用几次的话,写了这个是完全没意义的,所以这有两个不好的地方:
(1)重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数;
(2)代码的可维护性比较低,一个出错可能所有的重载均出错。
我们能否告诉编译器一个模子,让编译器根据不同的类型利用该模子来生成代码呢?
这就是所谓的泛型编程,编写与类型无关的通用代码,是代码复用的一种手段,模板是泛型编程的基础。
而这就需要我们来通过模板这个东西来实现,模板分为函数模板和类模板。
2.函数模板
2.1函数模板概念
函数模板代表了一个函数家族,该函数模板与类型无关,根据实参类型产生函数的特定类型版本。
2.2实现函数模板
模板的格式:template<typename T1,typename T2,……,typedname Tn>
其中T1、T2、……T3都是模板的参数,而这个template是关键字,typename是用来定义模板参数关键字,也可以使用class(切记不可用struct代替)。(到模板进阶(C++初阶最后的部分)会讲class与typename的区别)
如,我们之前实现的交换函数可以这样写:
#include<iostream>
using namespace std;
//需要几个类型就写几个参数
template<typename T>
void Swap(T& left, T& right)
{T temp = left;left = right;right = temp;
}
int main()
{//交换两个整型int a, b;cin >> a >> b;Swap(a, b);cout << a << " " << b << endl;//交换两个浮点型double c, d;cin >> c >> d;Swap(c, d);cout << c << " " << d << endl;//交换两个字符型char e, f;cin >> e >> f;Swap(e, f);cout << e << " " << f << endl;return 0;
}
运行结果如下:
如果我们实参不是一个类型,则会报错:
我们相较于之前写交换函数只是在函数定义前加了一行模板的定义而已,并且把类型换为模板了而已。
2.3模板的原理
函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。
所以其实模板就是将本来应该我们做的重复的事情交给了编译器。只是看实参类型用模板去匹配而已,实际上生成的两个函数都不是一样的,编译器根据实参类型生成一个新函数,如果有不同的类型就再生成一个新函数,地址不同。如,我们之前实现的交换函数:
在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应
类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,
将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。
2.4函数模板的实例化
用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化
和显式实例化。
2.4.1隐式实例化
让编译器根据实参推演模板参数的实际类型。
和我之前实现的那个交换函数调用时一样的形式,int a,b;Swap(a,b);则通过自动识别出a和b都是int类型,这就是隐式实例化。
但是如果我们给的是不同的类型,通过识别出两个实参类型不同就会报错,这个时候我们要么就改实参为同一类型,要么就用显式实例化,要么就要一个类型强制类型转换为另一类型:
#include<iostream>
using namespace std;
template<class T>
T Add(const T& left, const T& right)
{return left + right;
}
int main()
{int a = 3, b = 2;double c = 3.024, d = 4.501;cout << Add(a, b) << endl;cout << Add(c, d) << endl;cout << Add(a, (int)c) << endl;cout << Add((double)a, c) << endl;return 0;
}
运行结果如下:
建议不要去运行之前的交换排序代码,因为它我测试过不仅显式实例化没有用处,强制类型转换也没有用处,至于原因感兴趣的可以去探讨一下。
当然这里涉及到精度丢失的问题,所以建议Add这类的函数还是加一个参数写成如下形式:
但是返回值你也要改一下,要么返回double类型要么返回int类型!
template<class T1,class T2>
T1 Add(const T1& left, const T2& right)
{return left + right;
}
这是一个演示的,如果之后学的更多了,也可能会有其他类型的返回值等等。
2.4.2显式初始化
我们之前的代码也可以改为如下形式,这样的形式也不用强制类型转换了,直接用<>里面的类型进行生成函数的操作。
#include<iostream>
using namespace std;
template<class T>
T Add(const T& left, const T& right)
{return left + right;
}
int main()
{int a = 2, b = 3;double c = 4.53, d = 2.54;//指定参数为int类型(形参)cout << Add<int>(a, c) << endl;//指定参数为double类型(形参)cout << Add<double>(b, d) << endl;return 0;
}
运行结果如下:
当然,运行时输出的会有一个提示:
也就是说double转换为int会有小数点后的数据丢失,所以建议把int转换为double类型!因为这样算出来的结果才更加准确。
当然不是所有的都可以用两种实例化的方式:
template<class T>
T* func(size_t n)
{return new T[n];
}
因为形参没有任何的能代表T的类型,也就是说不能通过类型推理来知道T的类型,所以就只能进行显式实例化了。
2.5模板参数的匹配原则
(1)一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这
个非模板函数。
如:
// 专门处理int的加法函数
int Add(int left, int right)
{return left + right;
}// 通用加法函数
template<class T>
T Add(T left, T right)
{return left + right;
}void Test()
{Add(1, 2); // 与非模板函数匹配,编译器不需要特化Add<int>(1, 2); // 调用编译器特化的Add版本
}
若有int类型的,编译器会先用现成的(非模板),否则用模板的。但若我们不想用现成的我们就可以直接显式实例化。
(2)对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而
不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板。
如:
#include<iostream>
using namespace std;
// 专门处理int的加法函数
int Add(int left, int right)
{return left + right;
}// 通用加法函数
template<class T1, class T2>
T1 Add(T1 left, T2 right)
{return left + right;
}void Test()
{Add(1, 2);// 与非函数模板类型完全匹配,不需要函数模板实例化Add(1, 2.0);// 模板函数可以生成更加匹配的版本,编译器根据实参生成更加匹配的
}
只要非模板函数的形参类型与实参全部匹配就用非模板函数,但是如果是两个参数类型不一样的情况,发现模板函数用的不会使精度丢失,所以直接用了模板函数了。
(3) 模板函数不允许自动类型转换,但普通函数可以进行自动类型转换。
3.类模板
3.1类模板定义格式
template<class T1, class T2, ..., class Tn>
class 类模板名
{
// 类内成员定义
};
和之前的方式一样,当然,不是因为它是类就只能用class来定义参数,也可以用typename定义参数,只是现在没学到后面,不知道二者的区别而已。
我们可以把之前实现栈来改为这个方式:
#include<iostream>
using namespace std;
// 类模版
template<typename T>
class Stack
{
public:Stack(size_t capacity = 4){_array = new T[capacity];_capacity = capacity;_size = 0;}void Push(const T& data);
private:T* _array;size_t _capacity;size_t _size;
};
// 模版不建议声明和定义分离到两个文件.h 和.cpp会出现链接错误,具体原因后面会讲
template<class T>
void Stack<T>::Push(const T& data)
{// 扩容_array[_size] = data;++_size;
}
我们定义这个栈的时候如果成员函数声明和定义分离时不能忘记加这一行模板了,否则会出现:
3.2类模板的实例化
Stack<int> st1; // int
Stack<double> st2; // double
由于类模板不能通过隐式实例化来确定形参类型,所以必须用显式实例化,且注意:Stack是类名,Stack<int>是类型。
其次再补充一下之前的:
template<class T>
void Stack<T>::Push(const T& data)
{// 扩容_array[_size] = data;++_size;
}
模板参数不能是凭空出来的,故指定类域得加模板参数,否则T是用不了的,因为模板是给Stack类用的模板参数,因为模板参数是属于这个Stack类型,因为T可以为任意类型,若去掉,则本质上Push要实例化出多个,这样就不行了。
4.总结
这是模板初阶的东西,所以很多东西是没有讲解完全的,需要到模板进阶来讲清楚,但是模板进阶要很晚了,下面这张图片是C++初阶的全部内容,所以我们现在已经C++初阶过了一半了,之后难度会比较高(第8节开始),所以需要深入学习也需要持之以恒哦!
加油吧,相信自己能学会才是最好的安慰!喜欢的可以一键三连哦,下一节很简单,所以应该很快就发出来的!
相关文章:
C++初阶-模板初阶
目录 1.泛型编程 2.函数模板 2.1函数模板概念 2.2实现函数模板 2.3模板的原理 2.4函数模板的实例化 2.4.1隐式实例化 2.4.2显式初始化 2.5模板参数的匹配原则 3.类模板 3.1类模板定义格式 3.2类模板的实例化 4.总结 1.泛型编程 对广泛的类型法写代码,我…...
计算机网络自顶向下思维导图
主要就是记录下自己做的1-6章的思维导图,内容包含了每章每节内的重点内容 可能又错别字以及错误,欢迎指出 需要注意使用的是第七版的书 第一章 第二章 第二章二 第三章 第四章 第五章 第六章...
机器学习-入门-线性模型(1)
机器学习-入门-线性模型(1) 文章目录 机器学习-入门-线性模型(1)3.1 线性回归3.2 最小二乘解3.3 多元线性回归 3.1 线性回归 f ( x i ) w x i b 使得 f ( x i ) ≃ y i f(x_i) wx_i b \quad \text{使得} \quad f(x_i) \simeq y_i f(xi)wxib使得f(xi)≃yi 离散属性…...
Spark-Streaming3
无状态转换操作与有状态转换操作 无状态转换操作: 无状态转换操作仅处理当前时间跨度内的数据。例如,设置的采集时间为三秒,则只处理这三秒内的数据。 有状态转换操作(UpdateStateByKey): 有状态转换操作可以跨批次处理数据。涉及…...
【Pandas】pandas DataFrame rfloordiv
Pandas2.2 DataFrame Binary operator functions 方法描述DataFrame.add(other)用于执行 DataFrame 与另一个对象(如 DataFrame、Series 或标量)的逐元素加法操作DataFrame.add(other[, axis, level, fill_value])用于执行 DataFrame 与另一个对象&…...
【Spark入门】Spark简介:分布式计算框架的演进与定位
目录 1 大数据计算框架的演进历程 1.1 Hadoop MapReduce:第一代分布式计算框架 1.2 Spark的诞生与革新 2 Spark的核心架构与优势 2.1 Spark架构概览 2.2 Spark的核心优势解析 3 Spark的适用场景与定位 3.1 典型应用场景 3.2 技术定位分析 4 Spark与Hadoop…...
基于ArcGIS的洪水淹没分析技术-洪水灾害普查、风险评估及淹没制图中的实践技术
洪水灾害是全球面临的主要自然灾害之一,对人类社会和自然环境造成巨大影响。准确的洪水淹没分析对于灾害预防、风险评估及应急响应至关重要。ArcGIS作为一款强大的地理信息系统软件,在洪水淹没分析领域具有显著优势。ArcGIS的洪水淹没分析主要依赖于其强…...
【数据可视化-38】基于Plotly得泰坦尼克号数据集的多维度可视化分析
🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...
数据库MySQL学习——day6(多表查询(JOIN)基础)
文章目录 1、关系型数据库中的表关系2、连接(JOIN)的基本概念3、INNER JOIN(内连接)3.1. 概念3.2. 语法结构 4、LEFT JOIN(左连接)4.1. 概念4.2. 语法结构 5、RIGHT JOIN(右连接)&am…...
Mysql如何高效的查询数据是否存在
文章目录 1. 三种方法2. 查询语句执行流程3. 三种方式对比 1. 三种方法 在业务中,我们有时候需要查询某个数据在数据表中是否存在,常见的方式有三种 SELECT COUNT(*) FORM tb_name WHERE conditionSELECT 1 FROM tb_name WHERE conditionSELECT EXISTS (SELECT 1 FROM tb_nam…...
MySQL快速入门篇---增删改查(下)
目录 一、修改(Update) 1.语法 2.示例 二、删除(Delete) 1.语法 2.示例 三、聚合函数 1.示例 1.1、COUNT 1.2、SUM 1.3、AVG 1.4、MAX 1.5、MIN 四、分组查询(GROUP BY) 1.语法 2.示例 …...
Mysql中隐式内连接和显式内连接的区别
1. 内连接(INNER JOIN) 内连接是数据库中一种常见的连接方式,用于从两个或多个表中返回满足连接条件的记录,即只返回两张表中匹配的行。 示例场景:有学生表(包含学生 ID 和姓名)和成绩表&…...
检测软件系统如何确保稳定运行并剖析本次检测报告?
检测软件系统,能及时找出问题,确保软件稳定运行,保障用户使用体验。下面会具体剖析本次检测报告。 检测概述 本次检测覆盖了系统性能、功能完整性等关键方面。它对软件整体状况做了严格评估。检测时对系统代码展开深度审查。还借助专业工具…...
【Office-Excel】单元格输入数据后自动填充单位
1.自定义设置单元格格式 例如我想输入数字10,回车确认后自动显示10kg。 右击单元格或者快捷键(Ctrl1),选择设置单元格格式,自定义格式输入: 0"kg"格式仍是数字,但是显示是10kg&…...
GAMES202-高质量实时渲染(Real-Time Shadows)
目录 Shadow MappingshadowMapping的问题shadow mapping背后的数学PCF(Percentage Closer Filtering)PCSS(Percentage closer soft shadows)VSSM(Variance Soft Shadow Mapping)优化步骤3优化步骤1SAT&…...
vue+neo4j+flask 音乐知识图谱推荐系统
文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站,有好处! 编号: F027 架构: vueflaskneo4jmysql 亮点:协同过滤推荐算法知识图谱可视化 支持爬取音乐数据,数据超过3万条&…...
JavaScript 中 undefined 和 not defined 的区别
在 JavaScript 的调试过程中,你是否经常看到 undefined 却不知其来源?是否曾被 ReferenceError: xxx is not defined 的错误提示困扰?这两个看似相似的概念,实际上是 JavaScript 类型系统中最重要的分水岭。本文将带你拨开迷雾&am…...
设计一个新能源汽车控制系统开发框架,并提供一个符合ISO 26262标准的模块化设计方案。
今天,设计一个新能源汽车控制系统开发框架,并提供一个符合ISO 26262标准的模块化设计方案。以下为经过工业验证的技术方案: 一、系统架构设计 采用AUTOSAR Adaptive平台构建分布式系统,核心模块包括: 车辆控制单元(VC…...
基于STM32、HAL库的HX710A模数转换器ADC驱动程序设计
一、简介: HX710A是一款高精度24位模数转换器(ADC)芯片,专为电子秤和其他高精度测量应用设计。它通常与称重传感器(如应变片)配合使用,具有以下特点: 24位无失码精度 可编程增益:128或64 内置低噪声可编程放大器 片上稳压器,可直接为传感器供电 简单的数字接口(时钟+数据…...
python合并一个word段落中的run
在python-docx中,一个段落可以包含多个Run对象,每个Run对象可以具有不同的样式。如果你希望将一个段落中的所有Run对象合并为一个Run对象,同时保留所有文本内容,可以通过以下步骤实现: 合并Run对象的方法 遍历段落的…...
pytorch搭建并训练神经网络
#从小白开始学习人工智能# #学习笔记# 工具:pytorch 一、基础概念 1.神经网络是什么? 神经网络是人类受到生物神经细胞结构启发而研究出的算法体系。又称为人工神经网络(Artificial neural network) 最简版神经网络结构图&a…...
GCC 内建函数汇编展开详解
1. 引言 GNU 编译器集合(GCC)是广泛使用的开源编译器套件,支持多种编程语言,其中 C 语言编译器是其核心组件之一。在 C 语言编译过程中,GCC 不仅处理用户编写的标准 C 代码,还提供了一类特殊的函数——内建…...
iOS自定义电池电量显示控件 BatteryView 实现
iOS自定义电池视图:BatteryView 传送门:Android自定义电池电量显示控件 BatteryView 实现 在iOS开发中,自定义视图是提升用户体验的重要手段之一。本文将介绍如何通过Swift语言实现一个自定义的电池视图(BatteryView),并展示其功能和使用方法。 1. 功能概述 BatteryVi…...
LeetCode -- Flora -- edit 2025-04-27
1.接雨水 42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,…...
00-算法打卡-目录
1 数组 01-算法打卡-数组-二分查找-leetcode(704)-第一天-CSDN博客 02-算法打卡-数组-二分查找-leetcode(35)-第二天-CSDN博客 03-算法打卡-数组-二分查找-leetcode(34)-第三天_leetcode 34-CSDN博客 04-算法打卡-数组-二分查找-leetcode(69)-第四天-CSDN博客 05-算法打卡-数组…...
Vue2 与 Vue3 深度对比与技术解析
引言 Vue.js 是由尤雨溪创立的渐进式(progressive)JavaScript框架,自 2014 年发布以来,以其简单易用和灵活扩展性得到广泛应用。在 Vue2 的时代,它已经成为构建单页应用(SPA)和组件化开发的主流…...
Linux-UDP套接字编程
一.认识IP地址 IP 协议有两个版本, IPv4 和 IPv6. 我们之后凡是提到 IP 协议, 没有特殊说明的,默认都是指 IPv4。 IP 地址是在 IP 协议中, 用来标识网络中不同主机的地址;对于 IPv4 来说, IP 地址是一个 4 字节, 32 位的整数;我们通常也使用 "点分十进制" 的字符串表…...
tsconfig.json和tsconfig.node.json和tsconfig.app.json有什么区别
通过pnpm i vite 生成vue3项目时,会生成三个ts配置文件,分别是什么作用呢? 在Vue 3项目中,tsconfig.json、tsconfig.node.json和tsconfig.app.json是三个不同的TypeScript配置文件,它们分别用于不同的场景和目的。其中tsconfig.n…...
机器学习——Seaborn练习题
1、使用tips数据集,创建一个展示不同时间段(午餐/晚餐)账单总额分布的箱线图 import seaborn as sns import matplotlib.pyplot as plt import numpy as np import pandas as pdplt.rcParams["font.sans-serif"] ["SimHei"] plt.rcParams[&qu…...
Spring XML 外部实体(XXE)指南:示例和预防
什么是XXE? XML 文档遵循特定的标准。该标准强调了 XML 文档的构造方式,概述了有效 XML 文档与无效 XML 文档的区别等等。 该标准还指定了一个称为“实体”的术语。实体是某些内容的占位符。 实体可以是内部的,也可以是外部的(就像我们的情况一样)。 实体通过系统标识…...
C语言(3)—分支和循环
文章目录 一、程序的基本结构二、分支结构1. if语句2. if-else语句 三、关系与逻辑运算符1. 关系运算符2. 逻辑运算符 四、条件运算符(三目运算符)五、switch语句六、循环结构1. while循环2. for循环 七、循环控制语句1. break2. continue 八、循环嵌套九…...
【MCP】从一个天气查询服务带你了解MCP
1. 前言 这篇文章将通过一个集成高德天气查询的 MCP Server 用例,带你上手开发自己的 MCP Server ,文章将通过以下三种方式(自己编写 Client 端代码,使用 mcp-cli 自带页面,集成到 Claude 桌面版等)带你测试自己的 MC…...
【Leetcode 每日一题】3392. 统计符合条件长度为 3 的子数组数目
问题背景 给你一个整数数组 n u m s nums nums,请你返回长度为 3 3 3 的 子数组,满足第一个数和第三个数的和恰好为第二个数的一半。 子数组 指的是一个数组中连续 非空 的元素序列。 数据约束 3 ≤ n u m s . l e n g t h ≤ 100 3 \le nums.length…...
SALOME源码分析:Geomtry模块
本文分析SALOME Geometry模块。 一、核心组件 1.1 GeometryGUI 二、关键流程 三、插件 3.1 插件接口 GEOMPluginGUI定义了Geometry可以加载的插件接口。 3.2 插件列表 插件命令描述 BasicGUI BlocksGUI BooleanGUI BuildGUI DisplayGUI EntityGUI GenerationGUI GEOM…...
力扣HOT100之链表:23. 合并 K 个升序链表
这道题我是用最淳朴最简单的思路去做的,用一个while循环持续地将当前遍历到的最小值加入到合并链表中,while循环中使用一个for循环遍历整个指针数组,将其中的最小值和对应下标记录下来,并将其值加入到合并链表中,同时对…...
ArkTS 组件 通用事件 通用属性 速查表
ArkTS 组件 组件 通用事件 速查表 通用事件事件名称简要说明点击事件onClick(event: Callback<ClickEvent>, distanceThreshold: number): T相较于原有 onClick 接口,新增 distanceThreshold 参数作为点击事件移动阈值,当手指的移动距离超出所设…...
SOAP API 和 REST API
SOAP API 和 REST API 是两种主流的 Web 服务通信架构,它们在设计理念、数据格式、协议支持和应用场景上有显著差异。以下是两者的核心对比及典型应用场景: 1. 核心概念与设计哲学 特性SOAP APIREST API本质协议(基于 XML 的标准化协议&…...
简单了解Java的I/O流机制与文件读写操作
一、理解Java的I/O流机制 字节流 Java中的字节流主要由 InputStream 和 OutputStream 这两个抽象类及其子类构成。字节流以字节(byte)为基本处理单元,适用于处理所有类型的数据,包括文本、图片、音频、视频等。 1. InputStream…...
PCIe 转 U.2 接双硬盘指南 - 超微(Supermicro)主板
前言 公司服务器空间不够想扩容,尝试折腾了下超微(Supermicro)服务器的 PCIe 转 U.2,踩了一点小坑,特地写下来给大家参考一下。 现在市面上 U.2 接口的企业级固态硬盘相对其他类型接口的固态硬盘 便宜很多 ÿ…...
【上位机——MFC】文档
相关类 CDocument提供了一个用于管理数据的类,封装了关于数据的管理(数据提取、数据转换、数据存储等),并和视图类进行数据交互。 文档类使用 定义一个自己的文档类,派生自CDocument 程序的创建过程 1.利用框架类对象地址pFrame调用Load…...
JavaEE-多线程实战02
接上 多线程编程实战01 第三个多线程程序 package thread.test;//定义了一个叫MyThread3的类,实现了Runable接口,所以它必须重写run()方法 class MyThread3 implements Runnable {Overridepublic void run() {//线程执行的具体内容//进入一个无限循环,…...
计算机网络 | 应用层(6) -- 套接字编程
💓个人主页:mooridy 💓专栏地址:《计算机网络:自顶向下方法》 大纲式阅读笔记_mooridy的博客-CSDN博客 💓本博客内容为《计算机网络:自顶向下方法》第二章应用层第七节知识梳理 关注我…...
基于大模型的急性肠套叠全流程预测与诊疗方案研究报告
目录 一、引言 1.1 研究背景与目的 1.2 研究意义与创新点 二、急性肠套叠概述 2.1 定义与分类 2.2 病因与发病机制 2.3 流行病学特征 三、大模型技术原理与应用现状 3.1 大模型基本原理 3.2 在医疗领域的应用案例 3.3 用于急性肠套叠预测的可行性分析 四、术前风险…...
游戏遭遇DDoS攻击如何快速止损?实战防御策略与应急响应指南
是不是很抽象 我自己画的 一、游戏DDoS攻击特征深度解析 游戏行业DDoS攻击呈现复合型特征,2023年监测数据显示,针对游戏服务器的攻击中,63%采用UDP反射放大HTTP慢速攻击组合,攻击峰值达3.2Tbps。攻击者利用游戏协议特性ÿ…...
Linux电源管理(2)_常规的电源管理的基本概念和软件架构
原文: Linux电源管理(2)_Generic PM之基本概念和软件架构 1. 前言 Linux系统中那些常规的电源管理手段,包括关机(Power off)、待机(Standby or Hibernate)、重启(Reboot)等。这些…...
回文链表力扣234
思路: 对于这个题同样的找出题目的要求 1.判断回文 那么我们思考一下判断回文的方法,对于字符串我们只需要翻转一下就行,但是这不是通用的方法,在思考一下,我们是不是可以用双指针,一个在前一个在后,向中…...
互联网的下一代脉搏:深入理解 QUIC 协议
互联网的下一代脉搏:深入理解 QUIC 协议 互联网是现代社会的基石,而数据在其中高效、安全地传输是其运转的关键。长期以来,传输层的 TCP(传输控制协议)一直是互联网的主力军。然而,随着互联网应用场景的日…...
榕壹云国际版短剧系统:基于Spring Boot+MySQL+UniApp的全球短剧创作平台
一、项目背景与简介 在短视频行业高速发展的今天,短剧内容已成为全球用户娱乐消费的新宠。为满足市场对高质量、多样化短剧的需求,我们基于Spring Boot + MySQL + UniApp技术栈开发了榕壹云国际版短剧系统,这是一款面向全球市场的短剧创作与分发平台。系统不仅提供丰富的基…...
为什么选择 Spring Boot? 它是如何简化单个微服务的创建、配置和部署的?
为什么选择 Spring Boot? Spring Boot 的核心目标就是简化 Spring 应用的初始搭建以及开发过程。它并不是要取代 Spring Framework,而是构建在其之上,通过一系列“约定优于配置”的原则和自动化手段,让开发者能够更快的创建出独立…...
方向倒数、梯度和梯度下降的对比关系
一、方向导数与梯度的定义 方向导数 方向导数描述多元函数在某点沿特定方向的变化率。对于函数f(x,y),在点(x0,y0)沿单位向量u(u1,u2)的方向导数定义为: 其物理意义是函数值沿该方向的瞬时变化速率,正负表示增减趋势,…...