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

模版的特性及其编译分离

1.模版的分类

模版参数分为 类型形参 和 非类型形参

类型形参:出现在模版参数列表中,跟在class和typename之后的参数类型名称

非类型形参:就是用一个常量作为类(函数)模版的一个参数,在类(函数)模版中可将该参数当成常量来使用。

非类型参数通常用于定义静态数组或其他容器的大小。

namespace wxw
{template<class T, size_t N = 10>class array{private:T _arr[N];size_t _size;};
}
  • 上述情况可以和宏定义对比,但是宏定义是写死的而非类型参数可以是任意大小。
  • 指定整形,浮点数,类对象以及字符串是不允许作为非类型模版参数的(但在C++20以后才支持的)
  • 非类型的模版参数必须在编译期就能确定结果
  • 如果模版中只非类型参数且有缺省值,我们要调用时需要加<>(C++20后不需要)
  • 同时非类型参数可以有多个,bool也是属于整形家族。
template<size_t n = 10>class Stack{private:int _a[n];};int main()
{wxw::Stack<> a2;wxw::Stack a3;//C++20以前不支持
}

1.1array和静态数组

库里的array就是用到了非类型模版参数,array和静态数组相比有什么优势呢?

array在越界检查方面更为严格,同时array开空间效率更高。

静态数组越界写的时候采用的抽查,抽查数组后面的两个标记位,如果这两个标记位上被写了,就会检测到,越界读却不会检测。

array不管读或写都要调用operator[]函数array在operator中强制断言检查。

2.模版的特化

2.1 特化的概念

通常情况下,使用模版可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结果,需要特殊处理,比如:实现了一个专门用来进行小于比较的函数模版

template<class T>
bool Less(T left, T right)
{return left < right;
}int main()
{cout << Less(1, 2) << endl;Date d1(2025, 4, 5);Date d2(2025, 4, 4);cout << Less(d1, d2) << endl;//可以比较,结果正确Date* p1 = &d1;Date* p2 = &d2;cout << Less(p1, p2) << endl;//可以比较,结果错误return 0;
}

可以看到,Less绝大多数情况下都可以正常比较,但是在特殊场景下就得到错误的结果,上述示例中,p1指向的d1显然大于p2指向的d2对象,但是Less内部并没有比较p1和p2指向的对象内容,而比较的是p1和p2指针的地址,这就无法达到预期而错误。

此时,就需要对模版进行特化,即:在原模版类的基础上,针对特殊类型所进行特殊化的实现方式,模版特化中分为函数模版特化类模版特化

2.2函数模版特化

函数模版的特化步骤:

  1. 必须要先有一个基础的函数模版
  2. 关键字template后面接一对空的尖括号<>
  3. 函数名后跟一对尖括号,尖括号中指定需要特化的类型
  4. 函数形参表:必须要和模版函数的基础参数类型完全相同,如果不同,编译器可能会报一下奇怪的错误。
template<class T>
bool Less(T left, T right)
{return left < right;
}template<>
bool Less<Date*>(Date* left, Date* right)
{return *left < *right;
}int main()
{cout << Less(1, 2) << endl;Date d1(2025, 4, 5);Date d2(2025, 4, 4);cout << Less(d1, d2) << endl;//可以比较,结果正确Date* p1 = &d1;Date* p2 = &d2;cout << Less(p1, p2) << endl;//可以比较,结果错误return 0;
}

注意:一般情况下如果函数模版遇到不能处理,或者处理有误的类型,为了实现简单,通常都是将该函数直接给出。

bool Less(Date* left, Date* right)
{return *left < *right;
}

这种实现简单明了,代码可读性高,容易书写,编译器在模版和现有的函数中会优先选择现有的函数。

2.3const

template<class T>
bool Less(const T& left, const T& right)
{return left < right;
}//对Less函数模版进行特化
template<>
bool Less<Date*>(const Date*& left, const Date*& right)
{return *left < *right;
}

特化的参数列表明明和原来的模版一模一样为什么还会报错了?

所以当T是指针类型时,特化版本const要放在指针的右边。

template<>
bool Less<Date*>(Date* const& left, Date* const& right)
{return* left < *right;
}

同时如果const指针我们的特化模版也匹配不上,所有我们也要自己写一个const Date* 的特化

template<>
bool Less<const Date*>(const Date* const& left, const Date* const& right)
{return *left < *right;
}

我们不推荐函数模版的特化,更推荐直接写函数处理。

2.4 类模板特化

2.4.1 全特化

全特化即是将模版参数列表中所以得参数都确定化。

template<class T1,class T2>
class Date
{
public:Date(){cout << "Date<T1, T2>" << endl;}
private:T1 _d1;T2 _d2;
};template<>
class Date<int, char>
{
public:Date(){cout << "Date<int, char>" << endl;}
private:int _d1;char _d2;
};int main()
{Date<int, int> d1;Date<int, char> d2;
}

2.4.2 偏特化

偏特化:任何针对模版参数进一步进行条件限制设计的特化版本。

比如对于以下模版类:

template<class T1,class T2>
class Date
{
public:Date(){cout << "Date<T1, T2>" << endl;}
private:T1 _d1;T2 _d2;
};

偏特化有以下两种表现方式

  • 部分特化

        将模版参数列表中的一部分参数特化

template<class T1>
class Date<T1, int>
{
public:Date(){cout << "Date<T1, int>" << endl;}
private:T1 _d1;int _d2;
};
  • 参数更进一步的限制

        偏特化并不仅仅是指特化部分参数,而是针对模版参数更进一步的条件限制所设计出来的一个特化版本。

//两个参数偏特化为指针类型
template<class  T1,class T2>
class Date<T1*, T2*>
{
public:Date(){cout << "Date<T1*, T2*>" << endl;}
private:T1 _d1;T2 _d2;
};//两个参数偏特化为引用类型
template<class T1, class T2>
class Date<T1&, T2&>
{
public:Date(const T1& d1, const T2& d2):_d1(d1),_d2(d2){cout << "Date<T1&, T2&>" << endl;}
private:T1 _d1;T2 _d2;
};int main()
{Date<int, int> d1;Date<double, int> d2; //调用特化的int版本Date<int, double> d3; //调用基础的模版Date<int*, int*> d4; //调用特化的指针版本Date<int&, int&> d5(1, 2);//调用特化的引用版本}

这里的两个偏特化就是针对指针类型和引用类型的特化,也就是说只要是指针或引用就会匹配这两个特化版本。

需要注意的是指针或引用的特化是按照特化版本的参数匹配而非原模版。

这样是为了更方便我们在类模版里面使用类型。

template<class T1, class T2>
class Date<T1*, T2&>
{
public:Date(){cout << "Date<T1*, T2&>" << endl;int c = 0;T1 a = &c;T2 b = c;}
private:T1 _d1;T2 _d2;
};

这段函数编译报错,因为这里的T1不是int*,T2也不是int&

应该改成

template<class T1, class T2>
class Date<T1*, T2&>
{
public:Date(){cout << "Date<T1*, T2&>" << endl;int c = 0;T1* a = &c;T2& b = c;}
private:T1 _d1;T2 _d2;
};

这里int*和int&不是匹配原模版的模版参数,而是匹配特化版本的模版参数,这样设计我们就可以灵活使用,否则我们在类模版里面都无法使用int类型,这样设计我们用指针就T1*,用引用就是T2&即可。

3.模版分离编译

3.1 什么是分离编译

一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所以目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。

3.2 模版的分离编译

假如有以下场景,模版的声明与定义分离开,在头文件中进行声明,源文件中完成定义:

// a.h
template<class T>
T Add(const T& left, const T& right);// a.cpp
template<class T>
T Add(const T& left, const T& right)
{return left + right;
}// main.cpp
int main()
{Add(1, 2);Add(1.0, 2.0);return 0;
}



  • 显示实例化
//显示实例化int类型
template//不加<>和函数特化区分
int Add(const int& left, const int& right);

我们还是更推荐将声明和定义都放在.h中。

4.模版总结

  • 优点

        1.模版复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生

        2.增强了代码的灵活性

  • 缺点

        1.模版会导致代码膨胀问题,也会导致编译时间变长

        2.出现模版编译错误时,错误信息非常凌乱,不易定位错误

相关文章:

模版的特性及其编译分离

1.模版的分类 模版参数分为 类型形参 和 非类型形参 类型形参&#xff1a;出现在模版参数列表中&#xff0c;跟在class和typename之后的参数类型名称 非类型形参&#xff1a;就是用一个常量作为类&#xff08;函数&#xff09;模版的一个参数&#xff0c;在类&#xff08;函…...

8电池_多绕组反激式变压器均衡_4模式

(1)8节串联锂离子电池组 (2)多绕组双向反激式变压器&#xff0c;1个变压器解决多电池均衡 (3)亮点&#xff1a;支持1建切换4种均衡算法–>全网唯一 (4)多绕组变压器均衡也能设计多种均衡算法–>全网唯一 锂离子电池均衡&#xff0c;均衡拓扑&#xff0c;均衡算法...

6.1 python加载win32或者C#的dll的方法

python很方便的可以加载win32的方法以及C#编写的dll中的方法或者变量&#xff0c;大致过程如下。 一.python加载win32的方法&#xff0c;使用win32api 1.安装库win32api pip install win32api 2.加载所需的win32函数并且调用 import win32api win32api.MessageBox(0,"…...

STP学习

{所有内容均来自于西安欧鹏的陈俊老师} STP生成树 当二层交换机意外成环路的时候会发生&#xff1a; 1.广播风暴&#xff1a;当广播帧进入环路时&#xff0c;会被不断复制并传输&#xff0c;导致网络中的广播流量急剧增加&#xff0c;消耗大量的网络带宽&#xff0c;降低网络…...

特征值与特征向量:从理论到应用的全面解析

特征值与特征向量&#xff1a;从理论到应用的全面解析 一、特征值与特征向量核心概念 定义 对于方阵 ( A )&#xff0c;若存在标量 ( \lambda ) 和非零向量 ( v )&#xff0c;使得&#xff1a; [ A v \lambda v ] 则 ( \lambda ) 为特征值&#xff0c;( v ) 为对应的特征向…...

【Python】数组的条件逻辑统计运算元素排序

【Python】数组的条件逻辑&统计运算&元素排序&#xff1a; 一.条件逻辑二.统计运算三.数组元素排序检索数组元素是否满足条件查找数组的唯一元素判断元素是否在其他数组中 一.条件逻辑 import numpy as np arr_x np.array([1, 5, 7]) arr_y np.array([2, 6, 8]) arr_…...

数据流和重定向

1、数据流 不管正确或错误的数据都是默认输出到屏幕上&#xff0c;所以屏幕是混乱的。所以就需要用数据流重定向将这两 条数据分开。数据流重定向可以将标准输出和标准错误输出分别传送到其他的文件或设备去 标准输入&#xff08;standard input&#xff0c;简称stdin&#xff…...

Jetpack Compose 自定义组件完全指南

Jetpack Compose 自定义组件完全指南 Compose 的声明式 UI 范式为创建自定义组件提供了前所未有的灵活性。本指南将带你从基础到高级全面掌握 Compose 自定义组件的开发技巧。 一、自定义组件基础 1.1 基本结构 一个最简单的自定义组件&#xff1a; Composable fun Greeti…...

ETF 场内基金是什么?佣金最低又是多少呢?

嘿&#xff0c;朋友们&#xff0c;大家好啊&#xff0c;我是StockMasterX&#xff0c;今天咱们就坐下来慢慢聊聊这个话题&#xff0c;ETF 场内基金到底是个啥东西&#xff0c;它的佣金最低能到多少&#xff0c;真的是个值得深挖的问题。 说起ETF&#xff0c;我还记得刚入行那会…...

【C++篇】类与对象(中篇) 解密C++类的核心:六大默认成员函数详解与避坑指南

文章目录 前言一、类的六个默认成员函数二、构造函数1. 概念2. 特性&#xff08;牢记&#xff09; 三、析构函数1. 概念2. 特性&#xff08;牢记&#xff09; 四、拷贝构造函数1. 概念2. 特性&#xff08;牢记&#xff09; 五、赋值运算符重载1. 运算符重载2. 赋值运算符重载前…...

001 vue

https://cn.vuejs.org/ 文章目录 v-bindv-modelv-on修饰符条件渲染/控制&#xff1a;v-if v-show列表渲染 M&#xff1a;即Model&#xff0c;模型&#xff0c;包括数据和一些基本操作 V&#xff1a;即View&#xff0c;视图&#xff0c;页面渲染结果 VM&#xff1a;即View-Mode…...

web forms可视化开发显示的网页是用ExpressionWebEditorFrame控件,是IE内核还是简单的HTML解析?如何让他加载CSS和JS?

web forms可视化开发显示的网页是用ExpressionWebEditorFrame控件,是IE内核还是简单的HTML解析?如何让他加载CSS和JS? 1. ExpressionWebEditorFrame 控件的内核及解析机制 在 Visual Studio 中用于 Web Forms 可视化开发的 ExpressionWebEditorFrame 控件主要基于 Internet…...

$R^n$超平面约束下的向量列

原向量&#xff1a; x → \overset{\rightarrow}{x} x→ 与 x → \overset{\rightarrow}{x} x→法向相同的法向量&#xff08;与 x → \overset{\rightarrow}{x} x→同向&#xff09; ( x → ⋅ n → ∣ n → ∣ 2 ) n → (\frac{\overset{\rightarrow}x\cdot\overset{\righta…...

英伟达新一代GPU架构(50系列显卡)PyTorch兼容性解决方案

随着NVIDIA不断推出基于新架构的GPU产品&#xff0c;机器学习框架需要相应地更新以支持这些硬件。本文记录了在RTX 5070 Ti上运行PyTorch时遇到的CUDA兼容性问题&#xff0c;并详细分析了问题根源及其解决方案&#xff0c;以期为遇到类似情况的开发者提供参考。 在Anaconda虚…...

16.2Linux自带的LED灯驱动实验(详细编写)_csdn

这个实验不用自己编写代码。 1、在linux源代码中&#xff0c;打开 stm32mp15-pinctrl.dtsi 文件并进行修改&#xff1a; make uImage LOADADDR0XC2000040 -j8 //编译内核然后&#xff1a; 2、修改设备节点&#xff0c;打开 stm32mp157d-atk.dts&#xff1a; 其中&#xff1…...

Java 大视界 -- Java 大数据在智慧交通停车场智能管理与车位预测中的应用实践(174)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

HashMap 底层原理详解

1. 核心数据结构 JDK 1.7 及之前&#xff1a;数组 链表 JDK 1.8 及之后&#xff1a;数组 链表/红黑树&#xff08;链表长度 ≥8 时转红黑树&#xff0c;≤6 时退化为链表&#xff09; // JDK 1.8 的 Node 定义&#xff08;链表节点&#xff09; static class Node<K,V&g…...

重生之我是去噪高手——diffusion model

diffusion model是如何运作的&#xff1f; 想象一下&#xff0c;你有一张清晰的图片。扩散模型的核心思想分为两个过程&#xff1a; 前向过程&#xff08;Forward Process / Diffusion Process&#xff09;&#xff1a;逐步加噪反向过程&#xff08;Reverse Process / Denois…...

FfreeRTOS有阻塞作用的API

在 FreeRTOS 中,阻塞 API 是指那些会导致调用任务进入阻塞状态(Blocked State)的函数,即任务会暂时让出 CPU,直到某个条件满足(如超时、信号量可用、队列数据到达等)。以下是常见的阻塞 API 分类及示例: 1. 任务延迟(延时) vTaskDelay() 使任务阻塞指定的时间(以系统…...

app逆向专题二:app逆向流程

app逆向专题二&#xff1a;app逆向流程 一、app逆向说明二、拿到APP应用的apk三、使用工具进行查壳四、有壳需要先进行脱壳&#xff0c;拿到dex文件进行反编译五、使用Jadx-Gui或其他工具进行反编译&#xff0c;分析源码&#xff1b;六、根据app的抓包情况拿到加密的关键词参数…...

VMware 安装 Ubuntu 全流程实战指南:从零搭建到深度优化

在软件开发、系统测试以及技术学习等诸多场景中&#xff0c;使用虚拟机安装操作系统是一种灵活且高效的方式。Ubuntu 作为一款优秀的开源操作系统&#xff0c;在 VMware 虚拟机上的安装与优化备受关注。接下来&#xff0c;将为大家带来 VMware 安装 Ubuntu 的全流程实战指南&am…...

论文阅读笔记——RDT-1B: A DIFFUSION FOUNDATION MODEL FOR BIMANUAL MANIPULATION

RDT-1B 论文 模型表达与泛化能力&#xff1a;由于双臂操作中动作空间维度是单臂空间的两倍&#xff0c;传统方法难以建模其多模态分布。 数据&#xff1a;双臂数据少且不同机器人的物理结构和动作空间差异&#xff08;如关节数、运动范围&#xff09;导致数据分布不一致&#x…...

如何一天背300到500个单词

买一本有结构分析或词源注释的目标词汇书。 买一盒口香糖。 准备一摞空白的A4纸。 找一间用于冥想的黑屋子(眼晴闭上就可以了)。 将要背诵的单词进行分组: 5个一小组10个一中组50个一大组100个一个基本包或单元。给自己一个约定,比如背完一中组或一大组单词,嚼一粒口香糖…...

vs环境中编译osg以及osgQt

1、下载 OpenSceneGraph 获取源代码 您可以通过以下方式获取 OSG 源代码: 官网下载:https://github.com/openscenegraph/OpenSceneGraph/releases 使用 git 克隆: git clone https://github.com/openscenegraph/OpenSceneGraph.git 2、下载必要的第三方依赖库 依赖库 ht…...

C++ - 头文件基础(常用标准库头文件、自定义头文件、头文件引入方式、防止头文件重复包含机制)

一、头文件 在 C 中&#xff0c;头文件&#xff08;.h&#xff09;用于函数声明、类定义、宏定义等等 在 Visual Studio 中&#xff0c;头文件通常放在头文件目录中&#xff0c;头文件实现通常放在源文件目录中 二、常用标准库头文件 1、输入输出 <iostream> 标准输入…...

12款字重国外法国风格复古报纸日历设计衬线英文字体安装包 Claire Font Family

Claire 是一个带有坚固衬线的字体系列。该系列中的几种粗细字体非常适合设置大量连续文本&#xff1b;另一方面&#xff0c;极轻和极重的字体在显示应用中配合使用效果很好。Clair 中的字体具有垂直轴&#xff0c;其设计让人联想到当代报纸字体以及 Century 模型中的十九世纪晚…...

Java 类型转换和泛型原理(JVM 层面)

一、类型转换 概念解释&#xff1a; 编译类型&#xff1a;在编译时确定&#xff0c;保存在虚拟机栈的栈帧中的局部变量表中&#xff1b; 运行类型&#xff1a;在运行时确定&#xff0c;由保存在局部变量表中变量指向的堆中对象实例的类型决定&#xff08;存储在对象头中&…...

ffmpeg基础知识入门

文章目录 &#x1f4e6; 1. **容器&#xff08;Container&#xff09;**✅ 定义&#xff1a;✅ 举例&#xff1a;✅ 功能&#xff1a; &#x1f4f6; 2. **媒体流&#xff08;Stream&#xff09;**✅ 定义&#xff1a;✅ 举例&#xff1a;✅ 流和容器关系&#xff1a; &#x1…...

k8s 1.23升级1.24

0、简介 这里只用3台服务器来做一个简单的集群&#xff0c;当前版本是1.23.17目标升级到1.24.17 地址主机名192.168.160.40kuber-master-1192.168.160.41kuber-master-2192.168.160.42kuber-node-1 我这里设置的master2可调度pod&#xff0c;将master2的污点去掉 kubectl de…...

MIPI与DVP接口摄像头:深度解析与应用指南

1、MIPI 1.1 MIPI简介 MIPI是什么&#xff1f;MIPI&#xff1a;mobile industry processor interface移动行业处理器接口。它是一个由Intel、Motorola、Nokia、NXP、Samsung、ST&#xff08;意法半导体&#xff09;和TI&#xff08;德州仪器&#xff09;等公司发起的开放标准…...

liunx输入法

1安装fcitx5 sudo apt update sudo apt install fcitx fcitx-pinyin 2配置为默认输入法 设置-》系统-》区域和语言 点击系统弹出语言和支持选择键盘输入法系统 3设置设置 fcitx-configtool 如果没显示需要重启电脑 4配置fcitx 把搜狗输入法放到第一位&#xff08;点击下面…...

马吕斯定律(Malus‘s Law)

马吕斯定律&#xff08;Maluss Law&#xff09;详解 马吕斯定律是偏振光学中的基本定律&#xff0c;由法国物理学家**tienne-Louis Malus**于1809年发现&#xff0c;描述了**线偏振光**通过检偏器后的光强变化规律。 2. 实验验证 3. 数学推导 4. 关键应用 5. 特殊情况讨论 …...

大厂算法面试 7 天冲刺:第6天-树与图深度剖析——高频算法面试题 Java 实战

&#x1f9e0; 第6天&#xff1a;树与图深度剖析——高频算法面试题 & Java 实战 &#x1f4da; 一、核心知识概览 Overview 1. 树&#xff08;Tree&#xff09; 树是一种非线性数据结构&#xff0c;常见于面试中的二叉树&#xff08;Binary Tree&#xff09;、二叉搜索树…...

C语言编译和链接错题

一、错题重现 1.用在switch语句中的关键字不包含哪个&#xff1f;( ) A.continue B.break C.default D.case 2.下面代码的结果是&#xff1a;( ) A.3 B.4 C.随机值 D.5 3.下面那个不是转义字符&#xff1f; A.\n B.\060 C.\q D.\b 二、错因分析及思考 1.题目看…...

吴恩达深度学习复盘(7)一个简单训练示例

简介 本篇简单讲解简单的神经网络训练。通过回顾逻辑回归模型训练&#xff0c;了解神经网络训练的相关内容。比如训练步骤、损失函数、优化算法以及深度学习库的使用&#xff0c;了解训练过程中的相关概念。 例子 手写数字识别&#xff08;判断是 0 还是 1&#xff09;。这是…...

道路坑洼目标检测数据集-665-labelme

文章目录 1.介绍3.标签介绍4.标注工具5.数据集下载 1.介绍 目标&#xff1a;从道路图像中检测坑洼&#xff1b; 应用&#xff1a;检测道路地形和坑洼可实现平稳行驶&#xff0c;小型数据集常常用于学习和学术研究&#xff1b; 详细信息&#xff1a; 665 张图、1740个在坑洼处标…...

提升移动端用户体验:解决输入框被软键盘遮挡的有效方法

解决移动端输入框被软键盘覆盖的问题 在开发移动端网页时&#xff0c;如果页面包含输入框&#xff0c;则可能会遇到输入框被弹出的软键盘遮挡的问题。为了解决这个问题&#xff0c;我们需要理解两种常见的情况以及相应的解决策略。 浏览器未主动聚焦到输入框 现代浏览器和移…...

函数极限常见计算方法集锦

本文非常直接&#xff0c;如标题所见就是一个常见的计算方式极限方法的集锦。 所以内在逻辑性确实不强&#xff0c;主要通过例题的形式阐述。 添项减项 当题目出现了交错的形式便可以考虑添项减项。 一般而言我们会加一项交错项&#xff0c;减一项交错项。 例如出现 A B …...

Tomcat的部署

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和 并发访问用户不是很多的场合下被普遍使用&#xff0c;Tomcat 具有处理HTML页面的功能&#xff0c;它还是一个Servlet和 JSP容器 官网:Apache Tomcat - Welco…...

Ubuntu(CentOS、Rockylinux等)快速进入深度学习pytorch环境

这里写自定义目录标题 安装进入系统&#xff08;如Ubuntu22.04&#xff09;安装anacondapip、conda换源pip换源conda换源 安装nvidia安装pytorch环境针对于wsl的优化 安装进入系统&#xff08;如Ubuntu22.04&#xff09; docker 、 wsl 、 双系统 、服务器系统 推荐 Ubuntu 20…...

AI 如何帮助我们提升自己,不被替代

在当今快速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;正逐渐渗透到生活的方方面面。许多人担心 AI 会取代人类的工作&#xff0c;然而&#xff0c;AI 更多的是作为一种强大的赋能工具&#xff0c;帮助我们提升自身能力&#xff0c;让我们在工作中更具竞争力。以…...

ROS2 多机时间同步(Chrony配置简明指南)

适用场景&#xff1a; 主机运行 ROS2 Humble&#xff08;发布 /scan 等&#xff09;&#xff0c;板子运行 ROS2 Foxy&#xff08;发布 /tf 等&#xff09;&#xff0c;两边通过 ROS_DOMAIN_ID 跨平台通讯。需要保证系统时间对齐&#xff0c;避免 TF 插值失败、建图抖动等问题。…...

C 语言排序算法:从基础到进阶的全面解析一、引言

一、引言 在 C 语言编程领域&#xff0c;排序算法是一项基础且核心的技能。无论是处理海量数据&#xff0c;还是优化程序性能&#xff0c;选择合适的排序算法都至关重要。本文将深入剖析 C 语言中常见的几种排序算法&#xff0c;包括冒泡排序、选择排序、插入排序、希尔排序、…...

蓝桥云客--团队赛

2.团队赛【算法赛】 - 蓝桥云课 问题描述 蓝桥杯最近推出了一项团队赛模式&#xff0c;要求三人组队参赛&#xff0c;并规定其中一人必须担任队长。队长的资格很简单&#xff1a;其程序设计能力值必须严格大于其他两名队友程序设计能力值的总和。 小蓝、小桥和小杯正在考虑报名…...

VBA第三十八期 VBA自贡分把表格图表生成PPT

上一节讲到把数据区域自动生成PPT&#xff0c;这一实例是把图表自动生成PPT。 Sub CopyA11ChartsToPresenta&#xff08;&#xff09; Dim PP As PowerPoint. Application Dim PPPres As PowerPoint. Presentation Dim PPSlide As PowerPoint. SlideDim i As Integer Shee…...

Linux字符驱动设备开发入门之框架搭建

声明 本博客所记录的关于正点原子i.MX6ULL开发板的学习笔记&#xff0c;&#xff08;内容参照正点原子I.MX6U嵌入式linux驱动开发指南&#xff0c;可在正点原子官方获取正点原子Linux开发板 — 正点原子资料下载中心 1.0.0 文档&#xff09;&#xff0c;旨在如实记录我在学校学…...

Nextjs15 实战 - React Notes之SidebarNoteList优化和Suspense的使用

current branch 对应如下文档 redis ioredis 本专栏内容均可在Github&#xff1a;notes_02 找到 完整项目使用技术栈&#xff1a; Nextjs15 MySQL Redis Auth Prisma i18n strapi Docker vercel 一、本节目标 实现笔记列表展开回收和 Suspense 的实践 二、修改根…...

第三十章:Python-NetworkX库:创建、操作与研究复杂网络

一、NetworkX库简介 NetworkX是一个强大的Python库&#xff0c;用于创建、操作和研究复杂网络&#xff08;图&#xff09;的结构、动态和功能。它支持多种类型的图&#xff0c;包括无向图、有向图、加权图和多重图&#xff0c;并提供了丰富的图论算法和可视化工具。资源绑定附…...

cpp自学 day19(多态)

一、基本概念 同一操作作用于不同的对象&#xff0c;产生不同的执行结果 &#x1f449; 就像「按F1键」&#xff1a;在Word弹出帮助文档&#xff0c;在PS弹出画笔设置&#xff0c;​同一个按键触发不同功能 &#xff08;1&#xff09;多态类型 类型实现方式绑定时机​静态多态…...

Unity:销毁(Destroy)

Destroy的基本概念 Destroy是Unity提供的一个方法&#xff0c;用于立即或延迟销毁游戏对象&#xff08;GameObject&#xff09;或其组件&#xff08;Component&#xff09;。它会从场景中移除对象&#xff0c;并释放相关资源&#xff08;比如内存&#xff09;。 语法 销毁Ga…...