C++——模版

前言:哈喽小伙伴们好久不见,这是2024年的第一篇博文,我们将继续C++的学习,今天这篇文章,我们来习一下——模版。


目录

一.什么是模版

二.模版分类

1.函数模版

 2.类模板

总结


一.什么是模版

说起模版,我们都很容易想到套模版这个词汇:给你一个固定的格式,然后按照这个格式去完成你的作品之类的

而我们C++中的模版也确实如此,它包括函数模版和类模版两种,它的格式为:

template<typename/class T1,.......>

void fun(T1 .....)

其中template是定义模版的关键字,而typename和class则是定义模版参数的关键字,二者都可以使用,模版的参数可以不止一个T1就代表一个要套用模版的参数类型而T1并不是固定的写法,而是因为类型的英文为type而一般情况下都默认为T

要注意的是定义模版之后,要使用模版的函数要紧挨定义,二者中间不能有任何其他代码


二.模版分类

1.函数模版

我们经常使用swap交换函数这个简单的函数,但是有一个问题是,普通的函数只能定义单一的参数类型,就算可以使用typedef来重定义在改变类型时我们也需要不断的修改,这依然不是很方便。

所以我们引入了函数模版这个概念,使用函数模版定义的函数,无论传入任意类型的参数,都可以实现其功能

下面我们就以swap交换函数为例来介绍模版的具体用法:

#include<iostream>
using namespace std;
template<typename T>
void Swap(T& a, T& b)
{T temp = a;a = b;b = temp;
}
int main()
{int a = 1;int b = 2;Swap(a, b);cout << a << ' ' << b << endl;double x = 1.1;double y = 2.2;Swap(x, y);cout << x << ' ' << y << endl;}

如上,套用模版的函数,其参数类型即为T,随后在使用时,我们只需要将要交换的数据传入,T便会接收并自动转换为该实参的类型,即可完成不同类型的实参共用一个函数的结果:

但是这样的写法,却只能满足相同类型实参直接的交换,如果想要操作不同类型的实参,则需要模版函数也存在同样数量的参数类型数量:

#include<iostream>
using namespace std;template<typename T1,typename T2>void Add(T1 a, T2 b)
{cout<< a + b <<endl;
}
int main()
{int a = 1;double b = 2.2;Add(a, b);return 0;
}

在调用函数模版时,T1便会接受a的类型,T2则接收b的类型,结果如下:

除此之外,一个模版函数还可以与一个同名的非模版函数同时存在,这类似于函数重载

#include<iostream>
using namespace std;template<typename T1,typename T2>void Add(T1 a, T2 b)
{cout<< a + b <<endl;
}
void Add(int a, int b)
{cout << a + b << endl;
}
int main()
{int a = 1;int c = 2;double b = 2.2;Add(a, c);Add(a, b);return 0;
}

当这种情况存在时,Add函数会默认先去调用非模版参数去判断参数类型是否一致,一致则使用该非模版函数,不一致则去调用模版函数。 


 2.类模板

类模版的写法就和函数模版类似了,其作用都是将一些类型不确定或是经常改变的变量的类型用模版去代替。比如我们实现一个顺序表:

template<typename T>
class Qlist
{
public:void Pushback(T& a, T n){....}
private:T* _a;int _size;int _capacity;
};
int main()
{Qlist<int> q;return 0;
}

我们只需要在创建顺序表时给出数据类型即可。 


总结

模版的内容比较简单,就分享到这里。

喜欢博主文章的小伙伴记得一键三连,我们下期再见!

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

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

相关文章

深入理解Python中的math和decimal模块:数学基础与高精度计算实战【第104篇—math和decimal模块】

深入理解Python中的math和decimal模块 在Python中&#xff0c;math 和 decimal 模块是处理数学运算的重要工具。math 提供了一系列常见的数学函数&#xff0c;而 decimal 则专注于高精度的浮点数运算。本文将深入探讨这两个模块的基础知识&#xff0c;并通过实际的代码示例演示…

如何利用pynlpir进行中文分词并保留段落信息

一、引言 nlpir是由张华平博士开发的中文自然处理工具&#xff0c;可以对中文文本进行分词、聚类分析等&#xff0c;它既有在线的中文数据大数据语义智能分析平台&#xff0c;也有相关的python包pynlpir&#xff0c;其github的地址是&#xff1a; Pynlpir在Github上的地址 这…

如何用好应用权限,保护隐私数据?银河麒麟桌面操作系统V10 SP1 2303 update2新功能解析

为您介绍银河麒麟桌面操作系统V10 SP1 2303 update2隐私设置和权限管理功能&#xff0c;为您的个人数据安全保驾护航。 说到个人数据隐私&#xff0c;在科技重塑生活本质的数字世界&#xff0c;个人信息遭受持续威胁。2018年&#xff0c;某国际知名社交平台因安全系统漏洞而遭…

小朋友来自多少小区 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 幼儿园组织活动&#xff0c;老师布置了一个任务&#xff1a; 每个小朋友去了解与自己同一个小区的小朋友还有几个。 我们将这些数量汇总到数组 garden 中。 请…

【自动驾驶技术系列丛书学习】1.《自动驾驶技术概论》学习笔记

《自动驾驶技术概论》学习笔记 致谢&#xff1a;作者&#xff1a;王建、徐国艳、陈竞凯、冯宗宝 本书主要介绍汽车构造和无人驾驶汽车的基本概念&#xff0c;从基础开始&#xff0c;由浅入深地了解无人驾驶的历史由来、国内外自动驾驶产业现状及技术发展、自动驾驶汽车的技术架…

算法------(13)KMP

例题&#xff1a;&#xff08;1&#xff09;AcWing 831. KMP字符串 。。其实写完也不太理解。。随便写点吧 KMP就是求next数组和运用next的数组的过程。相比传统匹配模式一次更新一单位距离的慢速方法&#xff0c;next数组可以让下表字符串一次更新n - next【n】个距离&#x…

【研发日记】Matlab/Simulink技能解锁(三)——在Stateflow编辑窗口Debug

文章目录 前言 State断点 Transition断点 条件断点 按State步进 Watch Data Value Sequence Viewer 分析和应用 总结 前言 见《【研发日记】Matlab/Simulink技能解锁(一)——在Simulink编辑窗口Debug》 见《【研发日记】Matlab/Simulink技能解锁(二)——在Function编辑…

MATLAB图像噪声添加与滤波

在 MATLAB 中添加图像噪声和进行滤波通常使用以下函数&#xff1a; 添加噪声&#xff1a;可以使用imnoise函数向图像添加各种类型的噪声&#xff0c;如高斯噪声、椒盐噪声等。 滤波&#xff1a;可以使用各种滤波器对图像进行滤波处理&#xff0c;例如中值滤波、高斯滤波等。 …

基于CNN-LSTM-Attention的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1卷积神经网络&#xff08;CNN&#xff09;在时间序列中的应用 4.2 长短时记忆网络&#xff08;LSTM&#xff09;处理序列依赖关系 4.3 注意力机制&#xff08;Attention&#xff09; 5…

JVM垃圾回收详解

JVM垃圾回收详解 JavaGuide JDK7版本以及JDK7版本之前&#xff0c;堆内存通常分为下面三部分&#xff1a; 新生代&#xff08;年轻代&#xff09;内存老年代永久代 下图中的Eden区、两个S区S0、S1都属于新生代 JDK8版本之后永久代被元空间取代&#xff0c;元空间使用的是直…

洛谷题单_递推与递归

P1255 数楼梯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) //不满分做法&#xff1a;没有高精度 #include <bits/stdc.h> using namespace std; const int N5006; int dp[N];//dp[i]表示到第i节楼梯有dp[i]中方案 int main(){int n;cin>>n;dp[1]1;dp[0]1;for(i…

Docker实战——网络通信

目录 一、Docker 容器网络通信的基本原理1、查看 Docker 容器网络&#xff08;1&#xff09;新建一个 Dockerfile文件&#xff0c;内容如下&#xff1a;&#xff08;2&#xff09;使用以下命令创建镜像&#xff08;3&#xff09;基于 debian 的镜像创建一个容器&#xff0c;并进…