C++之模版详解

一.array与vector对比

由图发现,使用array数组是必须提前开好空间,而vector是顺序表,可以实现动态开辟空间

array也支持迭代器,如下:

int main()
{array<int, 10> arr{ 1,2,3,4,5,6,7,8,9,10 };auto it = arr.begin();while (it != arr.end()){cout << *it << " ";it++;}cout << endl;return 0;
}

使用时,需要注意的是auto类型推导的原类型是???

	auto it = arr.begin();array<int, 10>::iterator it = arr.begin();

array也支持下标访问,但是没有vector的头尾位置插入和删除

array支持的函数功能如下:

vector;

因此,实际上array没啥用处,所以大家了解即可

模板参数分类类型形参与非类型形参
 

类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。
非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用

 

二.非类型形参

template <class T,size_t N=100>
class myarray
{
public://
private:int _arr[N];int _size;int _capacity;
};
int main()
{myarray<int> arr;return 0;
}

注意:
1. 浮点数、类对象以及字符串是不允许作为非类型模板参数的。
2. 非类型的模板参数必须在编译期就能确认结果

 

三.模板的特化

如下:

我们发现传入指针时,该模版是无法比较a和b的大小的,此时就需要进行模板特化

定义;

在原模板类的基础上,针对特殊类型所进行特殊化的实现方式。模板特化中分为函数模板特化与类模板特化
 

1.函数模板特化

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

 

例如:

// 函数模板 -- 参数匹配
template<class T>
bool Less(T left, T right)
{return left < right;
}
//函数模版特化;
template<>
bool Less<int*>(int* left, int* right)
{return *left < *right;
}

此时我们就可以输出正确结果了

实际情况;

一般情况下如果函数模板遇到不能处理或者处理有误的类型,为了实现简单通常都是将该函数直接给出
该种实现简单明了,代码的可读性高,容易书写,因为对于一些参数类型复杂的函数模板,特化时特别给出,因此函数模板不建议特化

 

2.类模板特化

全特化:

全特化即是将模板参数列表中所有的参数都确定化

template<class T1,class T2>
class Sub
{
public:private:T1 _t1;T2 _t2;
};
//类模版全特化:
template<>
class Sub<int, char>
{
public:private:int _t1;char _t2;
};

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

偏特化有以下两种表现方式:
部分特化
将模板参数类表中的一部分参数特化

 

//类模板偏特化:
//部分特化
template<class T1>
class Sub<T1, int>
{
public:private:T1 _t1;char _t2;
};
//注意点;T1可以在后面,不像缺省一样必须后面一定要满足才考虑前面的情况
template<class T1>
class Sub<int,T1>
{
public:private:char _t1;T1 _t2;
};

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

 

//处理引用或者指针相关的偏特化;
template<class T1>
class Sub<int*, T1*>
{
public:private:char _t1;T1 _t2;
};

四.模板的分离编译

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

处理方法:

1. 将声明和定义放到一个文件 "xxx.hpp" 里面或者xxx.h其实也是可以的。推荐使用这种。
2. 模板定义的位置显式实例化。

 

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

 

模版的本质:

模版就是复用,将本来几段相似的代码,通过模版使用,从而使编译器帮助我们写出具体的内容,即我们不写出具体类型,由编译器去实例化!!!

最后,感谢大家的支持!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/760179.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【感悟《剑指offer》典型编程题的极练之路】01数组篇!

​​​​​​​ ​​​​​​​ 个人主页&#xff1a;秋风起&#xff0c;再归来~ ​​​​​​​ 文章所属专栏&#xff1a;《剑指offer》典型编程题的极练之路 ​​​​​​​ ​​​​​​​ …

内网横向1

IPC$详解 IPC( Internet Process Connection) 共享 “ 命名管道 ” 的资源 , 是为了实现进程间通信而开放的命名管道。 IPC 可以通过验证用户名和密码获得相应的权限&#xff0c;通常在远程管理计算机和查看计算机的共享资源时使用 通过 ipc$ &#xff0c;可以与目标机器建立连…

vue3+ts+vite axios封装请求并扩展入参

requset.ts import axios, { AxiosResponse } from axios import { getToken, removeToken } from @/utils/auth// 创建axios实例 const service = axios.create({baseURL: , // 所有的请求地址前缀部分(没有后端请求不用写)timeout: 60000 // 请求超时时间(毫秒)// withCrede…

第六十一回 放冷箭燕青救主 劫法场石秀跳楼-编译安装飞桨paddlepaddle@openKylin+RISCV

卢俊义在水里被张顺抓住&#xff0c;用轿子抬到了梁山。宋江等人下马跪在地上迎接&#xff0c;请他坐第一把交椅。卢俊义宁死不从&#xff0c;大家只好说留他在山寨几天&#xff0c;先让李固带着马车货物回去。吴用对李固说&#xff0c;你的主人已经答应坐第二把交椅了&#xf…

企业微信应用消息点击打开小程序的方法

官方给的企业微信消息有两种&#xff1a;小程序消息和应用消息 小程序消息&#xff1a;是可以直接点击打开小程序的&#xff0c;但是在微信中收不到消息。&#xff08;企业微信中绑定小程序即可&#xff09; 应用消息&#xff1a;可以在微信中收到&#xff0c;但是不能直接点…

安科瑞智能断路器产品介绍【可监可控 远程操控 短路保护】

开发背景 过去几年智慧用电的产品应用中&#xff0c;大多数只安装于进线测。主要存在以下几个问题&#xff1a;难定位&#xff0c;不知道具体哪个回路出线问题&#xff0c;排查困难&#xff1b;出线过载或线缆温度过高无法知晓&#xff1b;即使是出线回路安装了的场景&#xf…

Vue3 依赖注入provide与inject

简介 关于provide与inject下面是vue官网上的一些介绍 通常情况下&#xff0c;当我们需要从父组件向子组件传递数据时&#xff0c;会使用props。想象一下这样的结构&#xff1a;有一些多层级嵌套的组件&#xff0c;形成了一颗巨大的组件树&#xff0c;而某个深层的子组件需要一个…

HarmonyOS卡片刷新服务,信息实时更新一目了然

如今衣食住行娱乐影音等App占据了大多数人的手机&#xff0c;一部手机可以满足日常大多需求&#xff0c;但对需要经常查看或进行简单操作的场景来说&#xff0c;总需要用户点开App操作未免过于繁琐。 针对该问题&#xff0c; HarmonyOS SDK为用户提供了Form Kit&#xff08;卡…

ARM64汇编07 - 访存指令

访存指令是ARM64汇编语言中的一部分&#xff0c;涵盖了数据访问和内存操作的指令。这些指令使处理器能够与内存进行交互&#xff0c;包括读取数据、写入数据以及执行其他内存相关的操作。理解这些指令对于理解处理器如何与内存交互以及如何管理数据至关重要。 访存指令介绍两个…

ChatGPT又要更新了?GPT-5发布时间确定!

在K-Startup-OpenAI Match Day活动上&#xff0c;OpenAI CEO萨姆奥特曼(Sam Altman)首次公开肯定了GPT-5的潜力。他指出&#xff0c;GPT-5不仅会带来显著的进步&#xff0c;更将在高级推理功能上实现一次前所未有的飞跃&#xff0c;打破外界对于其仅是渐进式提升的误解。 同时现…

开源表单设计器颗粒度级别控制表单的显示条件原理分析

表单渲染中, 有些表单的显示有不同条件, 比如需要上一个表单的开关打开,或者文本内容为 xxxx, 或者需要大于或等于或小于指定值, 或者需要选中某个选项, 或者需满足以上多个条件或在满足多个条件中的一个, 有 n 种场景选择, 这样就需要条件显示配置功能, 来满足多样化需求 预览…

【干货】Java开发者快速上手.NET指南

前言 前几天有小伙伴在技术群里发了一个微软官方出的&#xff1a;适用于Java开发人员的.NET快速入门免费电子书&#xff0c;今天大姚来分享一下Java开发者想要快速上手.NET有哪些教程和优质资料。 微软适用于Java开发人员的.NET快速入门指南 下载阅读地址&#xff1a;适用于 …

(基础)AJAX概念和axios使用、URL、请求方法和数据提交、HTTP协议、接口、form-serialize插件

AJAX概念和axios使用 AJAX概念 AJAX就是使用XMLHttpRequest对象与服务器通信&#xff0c;它可以使用JSON、XML、HTML和text文本等格式发送和接收数据&#xff0c;AJAX最吸引人的就是它的异步特性&#xff0c;也就是说它可以在不重新刷新页面的情况下与服务器通信&#xff0c;…

灰度方案设计

灰度实体类 Datapublic static class NewSwitch{//是否开启灰度&#xff0c;true是&#xff0c;false否Boolean enable;//灰度基数&#xff0c;-1的时候默认为全部开启灰度Long divisor;//灰度比例 参数对divisor取余小于等于mod命中灰度Long mod;//白名单&#xff0c;优先判断…

使用Linq的Distinct方法

代码进行简单的分析&#xff1a; DistinctBy 方法&#xff1a; 这个方法是一个泛型方法&#xff0c;参数包括 source&#xff08;要去重的源集合&#xff09;和 keySelector&#xff08;用于选择去重的键的委托&#xff09;。在方法内部&#xff0c;创建了一个 HashSet 对象 …

手撕C语言题典——逆序输出

有这样一个问题&#xff1a;读入一些整数&#xff0c;逆序输出到一行中。已知的是该整数不超过100个。我们该怎么办呢&#xff1f;我们先将这些整数循环输入&#xff0c;输入每个整数之后&#xff0c;我们只能将数组存下来&#xff0c;而这个地方就是数组。 本章可能用到的知识…

Python断言

Python断言 1 什么是Python断言2 使用场景3 常用断言函数 1 什么是Python断言 断言就是断定指定条件一定成立&#xff0c;若不成立则抛出异常。Python断言关键字为&#xff1a;assert&#xff0c;断言也可以理解为简单版的 if 语句&#xff0c;判断条件的值&#xff0c;若为Tr…

windows10装windows11的CMD(Terminal)终端

文章目录 一 前言二 安装Terminal三 启动设置成默认启动cmd 一 前言 我装了WSL的LINUX系统&#xff0c;在 windows10 系统下面不方便启动linux&#xff0c;但是Windows11 在cmd 里面就可以打开&#xff0c; 所以找了这个方法 二 安装Terminal 先在windows10微软的商城(Microso…

>>Vue3+pinia+echarts等实现疫情可视化大图

一.>>前言 1.这个项目是在小满实战篇可视化&#xff08;第九章-饼图&#xff09;_哔哩哔哩_bilibili 这一系列课程为基础来做的&#xff0c;真的很感谢小满老师&#xff0c;讲的内容干货满满&#xff0c;暂时解决了手上没有项目的难题。大家可以去观摩一下他的优质课程。…

什么是膨胀卷积/空洞卷积

什么是膨胀卷积/空洞卷积 膨胀卷积&#xff08;Dilated Convolution/Atrous Convolution&#xff09;&#xff08;下面都使用膨胀卷积 这个名词&#xff09; 先来一张图&#xff0c;让大家对于膨胀卷积有个直观的理解&#xff0c;上图左边就是普通卷积&#xff0c;右边是膨胀卷…