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

【C++】模板(进阶)

本篇我们来介绍更多关于C++模板的知识。模板初阶移步至:【C++】模板(初阶) 

1.非类型模板参数

1.1 非类型模板参数介绍

模板参数可以是类型形参,也可以是非类型形参。类型形参就是我们目前接触到的一些模板参数。

//类型模板参数
template<class T, class Container = vector<T>, class Compare = Less<T>>

非类型模板参数就是用一个常量作为模板的参数,在模板中可以将该参数当作常量使用。

//N为非类型模板参数
template<class T, size_t N = 10> //N给缺省值
template<size_t N> //N没给缺省值

比如说我们要弄一个数组长度是固定的栈。

template<size_t N>
class Stack
{
private:int _a[N]; //定长数组//...
};

在使用的时候就可以传想要的N的值。

int main()
{Stack<5> st1; //存5个数据Stack<10> st2; //存10个数据return 0;
}

1.1.1 和C语言宏对比

这个和C语言的宏区别还是很大的,C语言的宏只能存5个或者10个数据,不可以像上面这样st1存5个值,st2又能存10个数据。

#define N 5  //宏,此时st1和st2都是存5个数据
class Stack
{
private:int _a[N]; //定长数组//...
};int main()
{Stack st1; Stack st2; return 0;
}

1.1.2 底层原理及注意事项

非类型模板参数和传类型模板参数,模板的底层原理都是一样的,都是生成了不同的类,如果是函数模板就是生成了不同的函数

如果非类型模板参数给了缺省值,可以不传参,但是要加上<>。

template<size_t N = 5> //给缺省值
class Stack
{
private:int _a[N]; //定长数组//...
};int main()
{Stack<> st1; //不传参Stack<10> st2; //传参return 0;
}

不传参也不加<>的写法在C++20才支持,这里还是建议加上<>。 

注意:

1.非类型模板参数只能用于整形(bool也算整形),浮点数(C++20才支持)、类对象以及字符串是不允许作为非类型模板参数的。

2.. 非类型的模板参数必须在编译期就能确认结果。

 我们也可以有多个非类型模板参数。

template<size_t N = 5, bool fg = true> //给缺省值

1.2 array介绍

array是一个容器,底层就是一个静态的数组,它就用到了非类型模板参数

相关文档:array - C++ Reference  ,使用时包含头文件 #include <array>

第一个模板参数T类型模板参数,第二个模板参数N非类型模板参数。 

array支持迭代器也支持下标访问,array就没有头删尾删、头插尾插这样的接口了,因为它是定长的。

我们来用一下array,假如要定义一个类型为int,长度为10的数组。

array<int, 10> a1;

等同于 int a1[10]; 

array对于数组越界的检查是比较严格的,比如下面的例子。

int a2[10];
cout << a2[10] << endl;//读越界的位置

未报错。

但是 array的越界检查是比较严格的,会直接报错

补充一句:array的数据是存在栈上的,vector的数据是存在堆上的。 

2.模板的特化

我们在使用模板的时候,有些情况下对于一些特殊类型的结果可能不是我们想要的。这时我们就可以使用模板的特化。

2.1 函数模板的特化

比如说我们用函数模板实现两个数的小于比较。

template<class T>
bool Less(T left, T right)
{return left < right;
}

在通常情况下这个模板是没有问题的,像传一些int、double这样的内置类型。但是如果传自定义类型可能结果就不是我们想要的,比如说Date类,我们就可以用模板的特化。

函数模板的特化步骤:
1. 必须要先有一个基础的函数模板
2. 关键字 template 后面接一对 空的尖括号<>
3. 函数名后 跟一对尖括号,尖括号中指定需要特化的类型
4. 函数形参表 必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误。
template<>
bool Less<Date*>(Date* left, Date* right)
{return *left < *right;
}

当我们传参类型为Date*时,就会直接走特化的模板,传别的类型的参数时,还是走函数模板那一套。

2.2 类模板的特化

2.2.1 全特化

全特化就是将模板参数列表中所有的参数都确定化。假如这里有一个如下的类。

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

对这个类全特化就是在类名后面加上<>,<>里面写上具体类型。

template<>
class Date<int, char>
{
public:Date(){cout << "Date<int, char>" << endl;}
};

如果我们传int和char类型的参数过去,就直接匹配调用特化了的类,其余情况都调用正常的类模板。

int main()
{Date<int, int> d1;Date<int, char> d2;return 0;
}

2.2.2 偏特化(半特化)

偏特化有两种表现方式,部分特化参数更进一步的限制

部分特化

这种特化就是只特化一部分,如下。

template<class T1>
class Date<T1, char>
{
public:Date(){cout << "Date<int, char>" << endl;}
};

只要是第二个参数传的是char类型,就会匹配到这个偏特化(半特化)的类,其余情况还是匹配正常的类模板。

int main()
{Date<int, int> d1;Date<char, char> d2;Date<double, char> d3;return 0;
}

当全特化和偏特化(半特化)同时存在时,会优先选择全特化

template<class T1, class T2> //正常类模板
class Date 
{
public:Date(){cout << "Date<T1, T2>" << endl;}
};template<>  //全特化
class Date<int, char>
{
public:Date(){cout << "Date<int, char>" << endl;}
};template<class T1>  //偏特化
class Date<T1, char> 
{
public:Date(){cout << "Date<T1, char>" << endl;}
};int main()
{Date<int, char> d2; //优先选择全特化return 0;
}

 参数更进一步的限制

这种特化针对模板参数更进一步的条件限制所设计出来的一个特化版本。比如说下面这个。

template<class T1, class T2>
class Date<T1*, T2*>   //指针
{
public:Date(){cout << "Date<T1*, T2*>" << endl;}
};

这个特化的意思就是,只要参数传的是指针不管什么类型的指针,都走这个模板。比如说下面的例子。

int main()
{Date<int, char> d1;Date<int*, char*> d2; //传的指针Date<double*, char*> d3; //传的指针Date<int*, double*> d4; //传的指针Date<char*, int*> d5; //传的指针return 0;
}

除了特化成指针,还能特化成引用

template<class T1, class T2>
class Date<T1&, T2&>    //引用
{
public:Date(){cout << "Date<T1&, T2&>" << endl;}
};
Date<int&, char&> d6; //传的引用
Date<double&, char&> d7; //传的引用
Date<int&, double&> d8; //传的引用
Date<char&, int&> d9; //传的引用

两者混合也可以,一个指针一个引用。

template<class T1, class T2>
class Date<T1&, T2*>
{
public:Date(){cout << "Date<T1&, T2*>" << endl;}
};

易错点

我们先看下面这段代码。

template<class T1, class T2>
class Date<T1*, T2*>
{
public:Date(){cout << "Date<T1*, T2*>" << endl;T1 t;cout << typeid(t).name() << endl;}
};
int main()
{Date<int*, int*> d1;
}

代码中的t是什么类型?是 int* 还是 int?

是int。

如果传过去的是int**,t的类型就是int*。

Date<int**, int*> d1;

在特化的时候,除了指针这里会比较容易混淆,引用也是一样,比如下面这个例子。

template<class T1, class T2>
class Date<T1&, T2&>
{
public:Date(){cout << "Date<T1&, T2&>" << endl;T1 t;cout << typeid(t).name() << endl;}
};
void test6()
{Date<int&, int&> d1;
}

此时t的类型就是int,而不是int类型的引用。

所以,我们想定义一个指针或者引用的时候应该要像下面这样。

template<class T1, class T2>
class Date<T1&, T2*>
{
public:Date(){cout << "Date<T1&, T2*>" << endl;int a = 0;T1& t1 = a;  //定义引用T2* t2 = &a; //定义指针//...}
};

因为T1和T2在上面的情况下都是int类型,而不是我们想要的引用和指针。

3.模板分离编译及优缺点

3.1 模板的分离编译

我之前的很多篇博客用到了声明和定义分离的方法,主要是一些像模拟实现这样的代码较多的程序,随着我们更深入的学习,一个程序的代码量是会越来越多的,声明和定义分离可以让我们的代码更有条理。

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

程序要运行,一般要经历这几个步骤:预处理 -> 编译 -> 汇编 -> 链接

 而模板,是不支持声明和定义分离的,会发生链接错误。

所以建议模板的声明和定义放在同一个文件中,不要分离。 

3.2 模板的优缺点

【优点】
        1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生
        2. 增强了代码的灵活性
【缺陷】
        1. 模板会导致代码膨胀问题,也会导致编译时间变长
        2. 出现模板编译错误时,错误信息非常凌乱,不易定位错误

本次分享就到这里,我们下篇再见~

相关文章:

【C++】模板(进阶)

本篇我们来介绍更多关于C模板的知识。模板初阶移步至&#xff1a;【C】模板&#xff08;初阶&#xff09; 1.非类型模板参数 1.1 非类型模板参数介绍 模板参数可以是类型形参&#xff0c;也可以是非类型形参。类型形参就是我们目前接触到的一些模板参数。 //类型模板参数 …...

有了TiDB,是否还需要“散装”大数据组件?

有了TiDB&#xff0c;是否还需要“散装”大数据组件&#xff1f; 最近和同事们讨论一个问题&#xff1a;在大数据应用日益增多的今天&#xff0c;如果使用了TiDB这样的一体化数据库&#xff0c;还需要使用那些传统的大数据组件&#xff08;比如Hadoop、Spark等&#xff09;吗&…...

OSCP - Proving Grounds - BullyBox

主要知识点 如果发现有域名&#xff0c;则可以加入/etc/hosts后重新执行nmap,nikto等扫描dirsearch的时候可以使用完整一些的字典文件&#xff0c;避免漏掉信息.git dump 具体步骤 执行nmap 扫描&#xff0c;发现 80和22端口开放,访问后发现被重定向到 bullybox.local Star…...

升级《在线写python》小程序的分享功能。昨天忘了...

小程序是使用uniapp写的&#xff0c;忘了开启分享功能&#xff0c;导致它现在是这样的。 挺不方便的&#xff0c;所以需要开启分享权限&#xff0c; 由于我这个没有其他需要隐藏的私密页面&#xff0c;所以事直接全局开启就行 在App.vue文件里的onShow里开启即可。加入如下代…...

Spingboot整合Netty,简单示例

Netty介绍在文章末尾 Netty介绍 项目背景 传统socket通信&#xff0c;有需要自身管理整个状态&#xff0c;业务繁杂等问题。 pom.xml <dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.117.F…...

逆波兰表达式求值(力扣150)

这道题也是一道经典的栈应用题。为什么这样说呢&#xff1f;我们可以发现&#xff0c;当我们遍历到运算符号的时候&#xff0c;我们就需要操控这个运算符之前的两个相邻的数。这里相邻数不仅仅指最初数组里相邻的数&#xff0c;在进行了运算之后&#xff0c;得到的结果与后面的…...

Linux面试题

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

如何判断以太坊地址类型?

如何判断以太坊地址类型&#xff1f; 一、账户类型解释 2.1 以太坊外部账户&#xff08;Externally Owned Account&#xff0c;EOA&#xff09; 外部账户&#xff08;EOA&#xff09;是由私钥控制的账户&#xff0c;在以太坊网络中用来发送交易和执行其他操作。EOA 不是智能…...

有限元分析学习——Anasys Workbanch第一阶段笔记(14)静定与超静定问题、约束类型介绍、简支梁挠度求解和自定义材料库建立

目录 0 序言 1 静定与超静定问题 2 Workbranch中Supports介绍 3 简支梁挠度的有限元求解 4 自定义材料库建立 0 序言 静定与超静定问题、约束类型介绍、简支梁挠度求解和自定义材料库建立(内容对应视频22到24课)。 1 静定与超静定问题 在有限元分析中&#xff0c;不同的…...

为医院量身定制做“旧改”| 全视通物联网智慧病房

随着经济工作会议、卫生健康工作会议、“经济高质量发展成效”系列新闻发布会的依次召开&#xff0c;强基工程、三明医改、儿科和精神卫生服务年、中医药传承创新发展、促进生育、养老服务改革、病房改造提升行动...等关键词正成为新的热点&#xff0c;2025年卫生健康工作面临一…...

Java面试专题——面向对象

面向过程和面向对象的区别 面向过程&#xff1a;当事件比较简单的时候&#xff0c;利用面向过程&#xff0c;注重的是事件的具体的步骤/过程&#xff0c;注重的是过程中的具体的行为&#xff0c;以函数为最小单位&#xff0c;考虑怎么做。 面向对象&#xff1a;注重找“参与者…...

PHP异步非阻塞MySQL客户端连接池

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…...

【Linux 源码】内核态到用户态

文章目录 1. 由来2. 流程图3. 中断3.1 概念3.2 8259A芯片3.4 中断时的栈处理3.4.1 相同特权级3.4.2 不同特权级 3.5 中断流程3.6 定位中断程序3.7 中断流程步骤总结 4. 源码4.1 move_to_user_mode4.2 0号进程4.3 TSS和LDT在GDT表排布4.4 ldt中的0x17栈段 5. 总结 1. 由来 ​ 首…...

goland map学习-实践使用练习:判断存在及遍历

对于数据&#xff1a; type Person struct {Address stringAge intJob stringName string }type People map[string]Personvar per People{"1": Person{Address: "1",Age: 1,Job: "1",Name: "1",},"2&quo…...

【威联通】FTP服务提示:服务器回应不可路由的地址。被动模式失败。

FTP服务器提示&#xff1a;服务器回应不可路由的地址。被动模式失败。 问题原因网络结构安全管理配置服务器配置网关![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/1500d9c0801247ec8c89db7a44907e4f.png) 问题 FTP服务器提示&#xff1a;服务器回应不可路由的地址…...

两份PDF文档,如何比对差异,快速定位不同之处?

PDF文档比对是通过专门的工具或软件&#xff0c;自动检测两个PDF文件之间的差异&#xff0c;并以可视化的方式展示出来。这些差异可能包括文本内容的修改、图像的变化、表格数据的调整、格式的改变等。比对工具通常会标记出新增、删除或修改的部分&#xff0c;帮助用户快速定位…...

Vue.js 组件之间的通信模式

Vue.js 组件之间的通信模式 组件之间的通信模式 在 Vue.js 中&#xff0c;组件之间的通信是构建复杂应用的关键。根据组件之间的关系和需求&#xff0c;Vue 提供了多种通信方式。本文介绍了常见的通信模式及其详细示例。 一、父子组件通信 1. 父组件向子组件传递数据&#…...

【Linux 重装】Ubuntu 启动盘 U盘无法被识别,如何处理?

背景 U盘烧录了 Ubuntu 系统作为启动盘&#xff0c;再次插入电脑后无法被识别 解决方案&#xff08;Mac 适用&#xff09; &#xff08;1&#xff09;查找 USB&#xff0c;&#xff08;2&#xff09;格式化&#xff08;1&#xff09;在 terminal 中通过 diskutil list 查看是…...

.Net Core微服务入门全纪录(四)——Ocelot-API网关(上)

系列文章目录 1、.Net Core微服务入门系列&#xff08;一&#xff09;——项目搭建 2、.Net Core微服务入门全纪录&#xff08;二&#xff09;——Consul-服务注册与发现&#xff08;上&#xff09; 3、.Net Core微服务入门全纪录&#xff08;三&#xff09;——Consul-服务注…...

pyautogui自动化鼠标键盘操作

pyautogui&#xff0c;用来写自动化脚本&#xff0c;比按键精灵更方便。pyautogui.position()可以获取当前鼠标位置。pyautogui不支持中文输入&#xff0c;利用 pyperclip从剪切板粘贴输入。 # -*- coding: utf-8 -*- import time import os import traceback import logging …...

2024年AI大模型技术年度总结与应用实战:创新与突破并进

前言 回顾2024年&#xff0c;我一共发布了286篇博文&#xff0c;粉丝数也达到了43000多。这一年里&#xff0c;我收获颇丰&#xff0c;始终坚持AI大模型的研究方向&#xff0c;并且积极开展大模型的实战应用&#xff0c;也取得了一系列令人振奋的突破。 在286篇博文中&#…...

HTML中相对路径和绝对路径详解

文章目录 HTML中相对路径和绝对路径详解一、引言二、绝对路径1、定义2、使用场景3、代码示例 三、相对路径1、定义2、使用方法3、代码示例 四、使用示例1、图片路径2、CSS和JavaScript文件路径3、页面内部链接 五、总结 HTML中相对路径和绝对路径详解 一、引言 在HTML开发中&a…...

联通用户管理系统(一)

#联通用户管理系统&#xff08;一&#xff09; 1.新建项目 如果你是windows的话&#xff0c;界面应该是如下的&#xff1a; 2.创建app python manage.py startapp app01一般情况下&#xff1a;我们是在pycharm的终端中运行上述指令&#xff0c;但是pychrm中为我们提供了工具…...

STM32-CAN总线

1.CAN总线简介 CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线 2.CAN总线特征 两根通信线&#xff08;CAN_H、CAN_L&#xff09;&#xff0c;线路少&#xff0c;无需共地差分信号通信&#xff08;相对的是单端信号&#xff09;&#…...

mac m1下载maven安装并配置环境变量

下载地址&#xff1a;Download Apache Maven – Maven 解压到一个没有中文和空格的文件夹 输入pwd查看安装路径 输入cd返回根目录再输入 code .zshrc 若显示 command not found: code你可以通过以下步骤来安装和配置 code 命令&#xff1a; 1. 确保你已经安装了 Visual Studio…...

Linux -- HTTP 请求 与 响应 报文

目录 请求报文&#xff1a; 请求方法 响应报文&#xff1a; 状态码 与 状态码描述 共性 常见的报头 请求报文&#xff1a; 请求方法 方法说明GET获取资源POST传输实体主体PUT传输文件HEAD获得报文首部DELETE删除文件OPTIONS询问支持的方法TRACE追踪路径CONNECT要求用…...

oneplus3t-lineage-14编译-android7

lineageOS-14.1-oneplus3t-build.md lineageOS-14(android7)的开发者模式/usb调试(adb)有root功能, 而lineageOS-16(android9)无 oneplus3t-lineage-14编译-android7 1 清华linageos镜像 x lineage-14.1-20180223-nightly-oneplus3-signed.zip ntfs分区挂载为普通用户目录…...

Spring Boot与Spring的区别

在当今的Java开发领域&#xff0c;Spring框架无疑是最为重要且广泛应用的框架之一。而随着技术的不断发展和开发者对效率与便捷性的追求&#xff0c;基于Spring框架的Spring Boot应运而生。接下来&#xff0c;将详细阐述Spring Boot与Spring的主要区别&#xff0c;并通过实际的…...

阿九的python 爬虫进阶课18.3 学习笔记

文章目录 前言1. 爬取大标题2. 爬取小标题3. 证券栏下的标题4. 某篇文章里的具体内容 前言 网课链接&#xff1a;https://www.bilibili.com/video/BV1kV4y1576b/新浪财经网址&#xff1a;https://finance.sina.com.cn/需先下载库&#xff1a; conda install lxml布置爬取的一…...

对人型机器人的研究和展望

目录 概述 1 核心软硬件部件 1.1 运动控制部分 1.1.1 减速机 1.1.2 编码器 1.1.3 直流无刷电机 1.2 智能仿生手 1.3 控制板卡 2 人型机器人的应用 3 未来展望 概述 如果现在有人问&#xff1a;当前那个行业最火&#xff1f;毫无疑问答案肯定是人型机器人了。当前各类机…...

docker 使用远程镜像启动一个容器

使用前提&#xff1a; 首先你得安装docker,其次你得拥有一个远程镜像 docker run --name io_11281009 --rm -it -p 2233:22 -v .:/root/py -e ed25519_rootAAAAC3NzaC1lZDI1********Oy7zR7l7aUniR2rul ghcr.lizzie.fun/fj0r/io srv对上述命令解释&#xff1a; 1.docker run:…...

VTK知识学习(37)-频域处理

1、前言 在图像处理和分析中&#xff0c;经常会将图像从图像空间转换到其他空间中&#xff0c;并利用这些空间的性质对转换后的数据进行分析处理。图像频域处理借助空间变换将图像从图像空间转换到频域空间&#xff0c;根据频域空间的性质对数据进行处理(如滤波)&#xff0c;最…...

什么是软件架构

什么是软件架构 程序员说&#xff0c;软件架构是要决定编写哪些C程序或OO类、使用哪些库和框架 程序经理说&#xff0c;软件架构就是模块的划分和接口的定义 系统分析员说&#xff0c;软件架构就是为业务领域对象的关系建模 配置管理员说&#xff0c;软件架构就是开发出来的…...

RoCE网络及其协议栈详解(没有中间商赚差价的网络)

引言 随着数据中心对高性能、低延迟通信需求的不断增长&#xff0c;传统的TCP/IP以太网连接已经难以满足现代应用的要求。为了解决这些问题&#xff0c;RDMA&#xff08;Remote Direct Memory Access&#xff09;技术应运而生。RDMA是一种允许网络中的不同计算机直接访问对方内…...

el-dialog弹窗的@open方法中,第一次引用ref发现undefined问题,第二次后面又正常了

解决方法 直接不用这个open方法&#xff0c;转而用opened&#xff0c;代码例子&#xff1a; <el-dialog title"单个新增" :visible.sync"PlacardShowSingle" opened"openpbSingle()" width"1100px" top"1%" :close-on-c…...

基于阿里云视觉智能平台实现换脸程序

简介 阿里云视觉智能平台提供了一种强大的换脸功能&#xff0c;能够将视频中的人脸替换成其他图片中的脸。这种功能广泛应用于视频编辑、特效制作等领域。本文将介绍如何使用阿里云视觉智能平台进行视频换脸。 核心工作流程 整个换脸程序的实现可分为以下几个主要步骤&#…...

【2024年华为OD机试】(A卷,100分)- 完美走位 (Java JS PythonC/C++)

一、问题描述 题目解析 题目描述 在第一人称射击游戏中,玩家通过键盘的 A、S、D、W 四个按键控制游戏人物分别向左、向后、向右、向前进行移动。假设玩家每按动一次键盘,游戏人物会向某个方向移动一步。如果玩家在操作一定次数的键盘并且各个方向的步数相同时,此时游戏人…...

一文夯实垃圾收集的理论基础

如何判断一个引用是否存活 引用计数法 给对象中添加一个引用计数器&#xff0c;每当有一个地方引用它&#xff0c;计数器就加 1&#xff1b;当引用失效&#xff0c;计数器就减 1&#xff1b;任何时候计数器为 0 的对象就是不可能再被使用的。 优点&#xff1a;可即刻回收垃圾&a…...

jenkins-api操作

一. 简述&#xff1a; 在一个比较复杂的环境中&#xff0c; 往往会有自己开发的运维管理平台。在代码发布这块&#xff0c;尽管jenkins有一个比较方便的UI&#xff0c; 但很多团队还是喜欢集中式管理&#xff0c; 将发布功能(仅仅把jenkins作为一个发布组件使用)嵌入运维管理平…...

SpringBoot3+Vue3学习

什么是Spring Boot? Spring Boot 是Spring 提供的一个子项目&#xff0c;用于快速构建Spring应用程序 传统方式弊端&#xff1a;之前的项目都用Spring FrameWork构建&#xff0c;需要手动引入依赖&#xff0c;依赖之间有可能存在冲突&#xff0c;较为麻烦&#xff1b;在配置…...

SQL刷题快速入门(三)

其他章节&#xff1a; SQL刷题快速入门&#xff08;一&#xff09; SQL刷题快速入门&#xff08;二&#xff09; 承接前两个章节&#xff0c;本系列第三章节主要讲SQL中where和having的作用和区别、 GROUP BY和ORDER BY作用和区别、表与表之间的连接操作&#xff08;重点&…...

Flutter鸿蒙化中的Plugin

Flutter鸿蒙化中的Plugin 前言鸿蒙项目内PluginFlutter端实现鸿蒙端实现创建Plugin的插件类注册Plugin 开发纯Dart的package为现有插件项目添加ohos平台支持创建插件配置插件编写插件内容 参考资料 前言 大家知道Flutter和鸿蒙通信方式和Flutter和其他平台通信方式都是一样的&…...

Ubuntu 22.04.5 修改IP

Ubuntu22.04.5使用的是netplan管理网络&#xff0c;因此需要在文件夹/etc/netplan下的01-network-manager-all.yaml中修改&#xff0c;需要权限&#xff0c;使用sudo vim或者其他编辑器&#xff0c;修改后的内容如下&#xff1a; # Let NetworkManager manage all devices on …...

后端:MyBatis

文章目录 1. MyBatis1-1. Mybatis 工具类的封装1-2. Mybatis 通过集合或实体类传递参数-实现插入数据(增)1-3. MyBatis 实现删除数据(删)1-4. MyBatis 实现修改数据(改)1-5. MyBatis 实现查询数据(查) 2. MyBatis 配置文件中的一些标签和属性2-1.environments标签2-2. dataSour…...

CBAM-2018学习笔记

名称&#xff1a; Convolutional Block Attention Module (CBAM) 来源&#xff1a; CBAM: Convolutional Block Attention Module 相关工作&#xff1a; #ResNet #GoogleNet #ResNeXt #Network-engineering #Attention-mechanism 创新点&#xff1a; 贡献&#xff1a; 提…...

HTML根元素<html>的语言属性lang:<html lang=“en“>

诸神缄默不语-个人CSDN博文目录 在编写HTML页面时&#xff0c;通常会看到<html lang"en">这行代码&#xff0c;特别是在网页的开头部分&#xff0c;就在<!DOCTYPE html>后面。许多开发者可能对这个属性的含义不太了解&#xff0c;它到底有什么作用&…...

解决github无法clone的问题

问题背景 (base) ~$ git clone https://github.com/isaac-sim/IsaacLab.git 正克隆到 IsaacLab... fatal: 无法访问 https://github.com/isaac-sim/IsaacLab.git/&#xff1a;gnutls_handshake() failed: Error in the pull function.解决办法 我使用了代理&#xff0c;需要配…...

第1章:Python TDD基础与乘法功能测试

写在前面 这本书是我们老板推荐过的&#xff0c;我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后&#xff0c;我突然思考&#xff0c;对于测试开发工程师来说&#xff0c;什么才更有价值呢&#xff1f;如何让 AI 工具更好地辅助自己写代码&#xff0c;或许…...

【华为路由/交换机的ftp文件操作】

华为路由/交换机的ftp文件操作 PC&#xff1a;10.0.1.1 R1&#xff1a;10.0.1.254 / 10.0.2.254 FTP&#xff1a;10.0.2.1 S1&#xff1a;无配置 在桌面创建FTP-Huawei文件夹&#xff0c;里面创建config/test.txt。 点击上图中的“启动”按钮。 然后ftp到server&#xff0c;…...

【HBuilderX 中 Git 的使用】

目录&#xff1a; 一&#xff1a;安装必要的版本控制工具二&#xff1a;把Github上的项目克隆到本地三&#xff1a;将本地的项目上传到Github上 一&#xff1a;安装必要的版本控制工具 1️⃣ 安装 TortoiseGit 工具&#xff0c;下载地址&#xff1a;https://tortoisegit.org/do…...