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

C++:模板

目录​​​​​​​

一.泛型编程

二.模板

函数模板

类模板


一.泛型编程

在C++中,支持函数重载,如果我们通过函数重载实现通用的交换函数,写法如下:

void Swap(int& left, int& right)
{int temp = left;left = right;right = temp;
}
void Swap(double& left, double& right)
{double temp = left;left = right;right = temp;
}
void Swap(char& left, char& right)
{char temp = left;left = right;right = temp;
}
......

非常冗余,于是我们引入泛型编程的概念:通过编写与类型无关的代码,实现代码的复用。而在C++中,模板就是泛型编程的基础。

二.模板

模板有两种:函数模板和类模板

函数模板

语法:

template<typename T1, typename T2, ..., typename T3>

返回值类型 函数名(参数列表){}

typename是用来定义函数模板的关键字,也可以使用class关键字。

样例:

//交换函数模板
template<typename T>
void Swap(const T& x, const T& y)
{T tmp = x;x = y;y = tmp;
}int main()
{int i1 = 1, i2 = 2;double d1 = 1.1, d2 = 2.2;char c1 = 'a', c2 = 'b';//隐式实例化Swap(i1, i2);//隐式(推导)生成void Swap(const int& x, const int& y);Swap(d1, d2);//隐式(推导)生成void Swap(const double& x, const double& y);Swap(c1, c2);//隐式(推导)生成void Swap(const char& x, const char& y);//显式实例化float f1 = 1.1, f2 = 2.2;Swap<float>(f1, f2);//显式(手动)生成void Swap(const float& x, const float& y);return 0;
}

模板函数是一个蓝图,非具体函数,而是编译过程中,编译器根据蓝图生成了具体类型的函数。

模板参数实例化的两种方式:

隐式实例化:编译器根据实参推演模板参数的实际类型

显式实例化:函数名<>,在<>中指定模板参数的实际类型

 如果一个非模板函数和同名函数模板同时存在,且调用时实参和非模板函数完全匹配,编译器会优先调用这个非模板函数。

类模板

语法:

template<typename T1, typename T2, ... , typename Tn>

class 类模板名

{

        //成员定义

};

实现一个栈的类模板:

//Stack
template<typename T>
class Stack
{
public://构造函数Stack(int n = 4):_arr(new T[n]),_top(0),_capacity(n){}//析构函数~Stack(){delete[] _arr;_arr = nullptr;_top = _capacity = 0;}void Push(const T& x){T* tmp = new T[_capacity * 2];memcpy(tmp, _arr, sizeof(T) * _top);delete[] _arr;_arr = tmp;_capacity *= 2;_arr[_top++] = x;}void Pop(){_top--;}//...
private:T* _arr;int _top;int _capacity;
};int main()
{//Stack<int>和Stack<double>是类型,Stack仅仅是类名Stack<int> st_i;//存储int类型数据的栈Stack<double> st_d;//存储double类型数据的栈return 0;
}

 上述代码中,Stack<int>和Stack<double>是显式实例化出的两个存储不同数据类型的栈,它们属于不同的类型。

类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。

今天的内容就到这,感谢大家的支持!

相关文章:

C++:模板

目录​​​​​​​ 一.泛型编程 二.模板 函数模板 类模板 一.泛型编程 在C中&#xff0c;支持函数重载&#xff0c;如果我们通过函数重载实现通用的交换函数&#xff0c;写法如下&#xff1a; void Swap(int& left, int& right) {int temp left;left right;ri…...

假如浙江与福建合并为“浙福省”

在中国&#xff0c;很多省份之间的关系颇有“渊源”&#xff0c;例如河南与河北、湖南与湖北、广东与广西等等&#xff0c;他们因一山或一湖之隔&#xff0c;地域相近、文化相通。 但有这么两个省份&#xff0c;省名没有共通之处&#xff0c;文化上也有诸多不同&#xff0c;但…...

AI图片生成3D物体和2D视频提取3D动画

包括AI图片生成3D物体的网站&#xff1a; 第一个为Artefacts.AIhttps://app.artefacts.ai/starter 第二个为 https://3d.csm.ai/ 以下4个的视频教程连接https://www.youtube.com/watch?vmQQCyzTA_F8 第三个为Tripo AI: Tripo AI for Web 第四个为Meshy AI: Meshy - Free …...

Android 应用包名的定义 pm list packages查询的包名

问题 在AndroidManifest和build.gradle其实都有应用包名的定义&#xff0c;有时候发现两者不一样&#xff0c;那么最终编译到软件生效的是哪个呢&#xff1f; 现象 连接设备后&#xff0c;通过adb shell pm list packages 查询应用包名&#xff0c;所列的名称是在build.grad…...

递归相关练习

21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09; 重复子问题&#xff1a;将l1的头节点跟l2的头结点比较 得到一个较小的头节点l1 随后继续比较 将l1后面一个节点跟l2第一个节点比较 又得到一个较小的节点 不断下去 递归出口&#xff1a;当l1或者l2为空时候 返回…...

租房市场新动力:基于Spring Boot的管理系统

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…...

基于Python的B站视频数据分析与可视化

基于Python的B站视频数据分析与可视化 爬取视频、UP主信息、视频评论 功能列表 关键词搜索指定帖子ID爬取指定UP主的主页爬取支持评论爬取生成评论词云图支持数据存在数据库支持可视化 部分效果演示 爬取的UP主信息 关键词搜索爬取 指定UP主的主页爬取 指定为黑马的了 爬取视…...

远程:HTTP基本身份验证失败。提供的密码或令牌不正确,或者您的账户启用了两步验证,您必须使用个人访问令牌而不是密码。

问题描述&#xff1a; remote: HTTP Basic: Access denied. The provided password or token is incorrect or your account has 2FA enabled and you must use a personal access token insteadof a password. See http://gitlab.cnovit.com/help/topics/git/troubleshooting…...

聚合值和非聚合值比较【SQL】

文章目录 聚合值和非聚合值比较背景可以在HAVING中使用的聚合条件如何实现与非聚合值的比较与非聚合值的特殊比较 聚合值和非聚合值比较 背景 在数据库中&#xff0c;聚合值和非聚合值通常不直接比较&#xff0c;因为它们的上下文和用途不同。聚合值是通过聚合函数计算出来的…...

Python 学习 DAY1

现在我算是发现了&#xff0c;计算机这里就是得一直不停的学&#xff0c;卷完c卷java&#xff0c;卷完java卷python&#xff0c;卷完python卷机器学习、深度学习。《荀子劝学篇》&#xff1a;“君子曰&#xff1a;学不可以已。” 之前一直学python学得比较碎片化&#xff0c;现…...

`Pendulum`: 掌握时间的艺术,让Python日期时间操作不再复杂

文章目录 Pendulum: 掌握时间的艺术&#xff0c;让Python日期时间操作不再复杂第一部分&#xff1a;背景介绍第二部分&#xff1a;Pendulum是什么&#xff1f;第三部分&#xff1a;如何安装Pendulum&#xff1f;第四部分&#xff1a;简单的库函数使用方法now()today()tomorrow(…...

nginx------HTTP模块配置详解

Nginx 的 server 配置块是 Nginx 配置文件中的一个关键部分&#xff0c;用于定义虚拟主机。每个 server 块可以包含多个 location 块和其他指令&#xff0c;以处理特定的请求。下面是对 server 配置块的详细解释&#xff1a; 一 server 配置块的基本结构 http {# 其他全局配置…...

听见文本的魅力:AI 与未来的语音交互

AI 与未来的语音交互 引言什么是文本转语音&#xff08;TTS&#xff09;&#xff1f;当前 TTS 技术现状国内海外文本转语音能力调研文本转语音能力说明多情感风格SSML语音合成标记语言 未来趋势 引言 随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;文本转…...

Qt 窗口可见性 之 close函数和hide函数

close函数 基本功能 close() 方法的主要功能是关闭窗口&#xff0c;并触发一系列与关闭相关的事件和信号。调用此方法后&#xff0c;窗口将不再可见&#xff0c;但窗口对象本身仍然存在&#xff0c;并且可以被再次显示&#xff08;通过调用 show() 方法&#xff09;。 事件处…...

git bisect和git blame

1.用 git bisect 找到出错的commit 设置开始&#xff0c;最新的一个已知的错误的commit和第一个已知的正确的commit&#xff0c;通过二分法&#xff0c;找出第一个出错的commit。 二分查找法&#xff08;binary search method&#xff09;或二分法&#xff08;bisection meth…...

【面试题】Node.JS篇

1. 什么是Node.js?它的主要特点是什么?适用于哪些场景? Node.js 是一个基于Chrome V8引擎的JavaScript运行时环境&#xff0c;它允许JavaScript代码在服务器端运行。Node.js的主要特点是事件驱动、非阻塞I/O模型&#xff0c;这使得它非常适合处理高并发请求和实时应用。它适…...

Leetcode11:盛水最多的容器

原题地址&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳…...

php如何对海量数据进行基数统计

在PHP中&#xff0c;对海量数据进行基数统计通常可以使用布隆过滤器&#xff08;Bloom Filter&#xff09;或者Count-Min Sketch算法。以下是使用Count-Min Sketch算法的一个简单示例&#xff1a; class CountMinSketch {private $rows;private $columns;private $values;publ…...

git命令报错:fatal: not a git repository (or any of the parent directories): .git

当你执行 Git 命令时遇到错误信息 "fatal: not a git repository (or any of the parent directories): .git"&#xff0c;这表明你当前所在的目录不是一个 Git 仓库&#xff0c;或者你的工作目录不在 Git 仓库的根目录下。以下是一些解决这个问题的步骤&#xff1a;…...

如何通过sip信令以及抓包文件分析媒体发到哪个地方

前言 问题描述&#xff1a;A的媒体没转发到B&#xff0c;B只能听到回铃音&#xff0c;没有A的说话声音&#xff0c;并且fs这边按正常的信令发送了. 分析流程 分析早期媒体发送到哪一个IP 10.19.0.1发送了一个请求给10.19.0.157这个IP&#xff0c;然而这里的SDP媒体地址&am…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

React核心概念:State是什么?如何用useState管理组件自己的数据?

系列回顾&#xff1a; 在上一篇《React入门第一步》中&#xff0c;我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目&#xff0c;并修改了App.jsx组件&#xff0c;让页面显示出我们想要的文字。但是&#xff0c;那个页面是“死”的&#xff0c;它只是静态…...