C++模板初识

文章目录

    • 一、函数模板
      • 1. 函数模板
      • 2. 函数模板、模板的特例化、非模板函数的重载关系
      • 3. 外部调用
      • 4. 模板的非类型参数
      • 5. 代码示例
    • 二、类模板

一、函数模板

1. 函数模板

  1. 模板函数:在函数调用点,编译器用用户指定的类型,从原模板实例化一份函数代码出来。

  2. 模板的实参推演 => 可以根据用户传入的实参的类型,来推导出模板类型参数的具体类型。

  3. 函数模板是不进行编译的,因为类型还不知道;
    模板的实例化 - 函数调用点进行实例化模板函数才是要被编译器所编译的。

2. 函数模板、模板的特例化、非模板函数的重载关系

不属于重载关系,属于共存关系

3. 外部调用

模板代码是不能在一个文件中定义的。在另外一个文件中使用的模板代码调用之前,一定要看到模板定义的地方,这样的话,模板才能够进行正常的实例化,产生能够被编译器编译的代码。

	// 告诉编译器,进行指定类型的模板实例化template bool compare<int>(int, int);template bool compare<double>(double, double);

所以,模板代码都是放在头文件当中的,然后在源文件当中直接进行#include包含。

4. 模板的非类型参数

必须是整数类型(整数或地址/引用都可以),都是常量,只能使用,而不能修改。

	template<typename T int SIZE>void sort(T *arr) {for(int i = 0; i < SIZE - 1; ++i)for(int j = 0; j < SIZE - 1 - i; ++j)if(arr[j] > arr[j + 1]) {int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}int arr[] = { 12, 5, 7, 89, 32, 21, 35 };const int size = sizeof(arr) / sizeof(arr[0]);sort<int, size>(arr);

5. 代码示例

#include <iostream>
using namespace std;// 函数模板 
template<typename T> // 定义一个模板参数列表
bool compare(T a, T b) {cout << "template compare" << endl;return a > b;
}// 模板特例化 - 针对compare函数模板,提供const char*类型的特例化版本
template<>
bool compare<const char*>(const char* a, const char* b) {cout << "compare<const char*>" << endl; return strcmp(a, b) > 0;
}// 非模板函数 - 普通函数
bool compare(const char* a, const char* b) {cout << "normal compare" << endl;return strcmp(a, b) > 0;
}int main() {compare<int>(10, 20);compare(100, 20);compare("100", "20");compare<const char*>("100", "20");return 0;
}

输出结果:

template compare
template compare
normal compare
compare<const char*>

二、类模板

#include <iostream>
using namespace std;// 类模板 -> 实例化 -> 模板类
template<typename T>
class SeqStack { // 模板名称 + 类型参数列表 = 类名称
public:// 构造和析构函数名不用加<T>,其它出现模板的地方都加上类型参数列表SeqStack(int size = 10): _pstack(new T[size]), _top(0), _size(size){}~SeqStack() {delete[]_pstack;_pstack = nullptr;}SeqStack(const SeqStack<T>& stack): _top(stack._top), _size(stack._size){_pstack = new T[_size];// 不要用memory进行拷贝for (int i = 0; i < _top; ++i) {_pstack[i] = stack._pstack[i];}}SeqStack<T>& operator=(const SeqStack<T>& stack) {if (this == &stack) {return *this;}delete[]_pstack;_top = stack._top;_size = stack._size;_pstack = new T[_size];// 不要用memory进行拷贝for (int i = 0; i < _top; ++i) {_pstack[i] = stack._pstack[i];}return *this;}//void push(const T& val) { // 类外实现//	if (full())//		expand();//	_pstack[_top++] = val;//}void push(const T& val); void pop() {if (empty())return;--_top;}T top() const {if (empty())throw "stack is empty!"; // 抛异常也代表函数逻辑结束return _pstack[_top - 1]; }bool full() const { return _top == _size; }bool empty() const { return _top == 0; }
private:T *_pstack;int _top;int _size;// 顺序栈底层数组按2倍的方式扩容void expand() {T* ptmp = new T[_size * 2];for (int i = 0; i < _top; ++i) {ptmp[i] = _pstack[i];}delete[]_pstack;_pstack = ptmp;_size *= 2;}
};template<typename T>
void SeqStack<T>::push(const T& val) {if (full())expand();_pstack[_top++] = val;
}int main() {// 类模板的选择性实例化:只有调用到的类模板的函数才会实例化SeqStack<int> s1;s1.push(20);s1.push(30);s1.push(40);s1.push(50);s1.push(60);s1.pop();cout << s1.top() << endl; // 50// 类型参数如有默认值template<typename T=int>//SeqStack<> s2;return 0;
}

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

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

相关文章

手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion(代码)

手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion&#xff08;代码&#xff09; 目录 手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion&#xff08;代码&#xff09;Stable Diffusion 原理图Stable Diffusion的原理解释Stable Diffusion 和Di…

vscode+WSL2(ubuntu22.04)+pytorch+conda+cuda+cudnn安装系列

最近在家过年闲的没事&#xff0c;于是研究起深度学习开发工具链的配置和安装&#xff0c;之前欲与天公试比高&#xff0c;尝试在win上用vscodecuda11.6vs2019的cl编译器搭建cuda c编程环境&#xff0c;最后惨败&#xff0c;沦为笑柄&#xff0c;痛定思痛&#xff0c;这次直接和…

【ESP32】ESP-IDF开发 | WiFi开发 | TCP传输控制协议 + TCP服务器和客户端例程

1. 简介 TCP&#xff08;Transmission Control Protocol&#xff09;&#xff0c;全称传输控制协议。它的特点有以下几点&#xff1a;面向连接&#xff0c;每一个TCP连接只能是点对点的&#xff08;一对一&#xff09;&#xff1b;提供可靠交付服务&#xff1b;提供全双工通信&…

AI时序预测: iTransformer算法代码深度解析

在之前的文章中&#xff0c;我对iTransformer的Paper进行了详细解析&#xff0c;具体文章如下&#xff1a; 文章链接&#xff1a;深度解析iTransformer&#xff1a;维度倒置与高效注意力机制的结合 今天&#xff0c;我将对iTransformer代码进行解析。回顾Paper&#xff0c;我…

某盾Blackbox参数参数逆向

以前叫同盾&#xff0c;现在改名了&#xff0c;叫小盾安全&#xff0c;好像不做验证码了

docker中运行的MySQL怎么修改密码

1&#xff0c;进入MySQL容器 docker exec -it 容器名 bash 我运行了 docker ps命令查看。正在运行的容器名称。可以看到MySQL的我起名为db docker exec -it db bash 这样就成功的进入到容器中了。 2&#xff0c;登录MySQL中 mysql -u 用户名 -p 回车 密码 mysql -u root -p roo…

春节期间,景区和酒店如何合理用工?

春节期间&#xff0c;景区和酒店如何合理用工&#xff1f; 春节期间&#xff0c;旅游市场将迎来高峰期。景区与酒店&#xff0c;作为旅游产业链中的两大核心环节&#xff0c;承载着无数游客的欢乐与期待。然而&#xff0c;也隐藏着用工管理的巨大挑战。如何合理安排人力资源&a…

初始化mysql报错cannot open shared object file: No such file or directory

报错展示 我在初始化msyql的时候报错&#xff1a;mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory 解读&#xff1a; libaio包的作用是为了支持同步I/O。对于数据库之类的系统特别重要&#xff0c;因此…

C语言------数组从入门到精通

1.一维数组 目标:通过思维导图了解学习一维数组的核心知识点: 1.1定义 使用 类型名 数组名[数组长度]; 定义数组。 // 示例&#xff1a; int arr[5]; 1.2一维数组初始化 数组的初始化可以分为静态初始化和动态初始化两种方式。 它们的主要区别在于初始化的时机和内存分配的方…

Docker/K8S

文章目录 项目地址一、Docker1.1 创建一个Node服务image1.2 volume1.3 网络1.4 docker compose 二、K8S2.1 集群组成2.2 Pod1. 如何使用Pod(1) 运行一个pod(2) 运行多个pod 2.3 pod的生命周期2.4 pod中的容器1. 容器的生命周期2. 生命周期的回调3. 容器重启策略4. 自定义容器启…

【开源免费】基于SpringBoot+Vue.JS公交线路查询系统(JAVA毕业设计)

本文项目编号 T 164 &#xff0c;文末自助获取源码 \color{red}{T164&#xff0c;文末自助获取源码} T164&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

< OS 有关 > Android 手机 SSH 客户端 app: connectBot

connectBot 开源且功能齐全的SSH客户端,界面简洁,支持证书密钥。 下载量超 500万 方便在 Android 手机上&#xff0c;连接 SSH 服务器&#xff0c;去运行命令。 Fail2ban 12小时内抓获的 IP ~ ~ ~ ~ rootjpn:~# sudo fail2ban-client status sshd Status for the jail: sshd …

中国股市“慢牛”行情的实现路径与展望

在现代经济体系中&#xff0c;股市不仅是企业融资的重要平台&#xff0c;也是投资者财富增值的关键渠道。一个健康、稳定、持续增长的股市&#xff0c;对于推动经济高质量发展、提升国家金融竞争力具有深远意义。近年来&#xff0c;“慢牛”行情成为众多投资者和市场参与者对我…

Linux Samba 低版本漏洞(远程控制)复现与剖析

目录 前言 漏洞介绍 漏洞原理 产生条件 漏洞影响 防御措施 复现过程 结语 前言 在网络安全的复杂生态中&#xff0c;系统漏洞的探索与防范始终是保障数字世界安全稳定运行的关键所在。Linux Samba 作为一款在网络共享服务领域应用极为广泛的软件&#xff0c;其低版本中…

ResNet 残差网络

目录 网络结构 残差块&#xff08;Residual Block&#xff09; ResNet网络结构示意图 残差块&#xff08;Residual Block&#xff09;细节 基本残差块&#xff08;ResNet-18/34&#xff09; Bottleneck残差块&#xff08;ResNet-50/101/152&#xff09; 残差连接类型对比 变体网…

【Unity3D】实现横版2D游戏角色二段跳、蹬墙跳、扶墙下滑

目录 一、二段跳、蹬墙跳 二、扶墙下滑 一、二段跳、蹬墙跳 GitHub - prime31/CharacterController2D 下载工程后直接打开demo场景&#xff1a;DemoScene&#xff08;Unity 2019.4.0f1项目环境&#xff09; Player物体上的CharacterController2D&#xff0c;Mask添加Wall层…

FPGA 使用 CLOCK_LOW_FANOUT 约束

使用 CLOCK_LOW_FANOUT 约束 您可以使用 CLOCK_LOW_FANOUT 约束在单个时钟区域中包含时钟缓存负载。在由全局时钟缓存直接驱动的时钟网段 上对 CLOCK_LOW_FANOUT 进行设置&#xff0c;而且全局时钟缓存扇出必须低于 2000 个负载。 注释&#xff1a; 当与其他时钟约束配合…

Excel 技巧21 - Excel中整理美化数据实例,Ctrl+T 超级表格(★★★)

本文讲Excel中如何整理美化数据的实例&#xff0c;以及CtrlT 超级表格的常用功能。 目录 1&#xff0c;Excel中整理美化数据 1-1&#xff0c;设置间隔行颜色 1-2&#xff0c;给总销量列设置数据条 1-3&#xff0c;根据总销量设置排序 1-4&#xff0c;加一个销售趋势列 2&…

Leetcode:219

1&#xff0c;题目 2&#xff0c;思路 第一种就是简单的暴力比对当时过年没细想 第二种&#xff1a; 用Map的特性key唯一&#xff0c;把数组的值作为Map的key值我们每加载一个元素都会去判断这个元素在Map里面存在与否如果存在进行第二个判断条件abs(i-j)<k,条件 符合直接…

MySQL(高级特性篇) 14 章——MySQL事务日志

事务有4种特性&#xff1a;原子性、一致性、隔离性和持久性 事务的隔离性由锁机制实现事务的原子性、一致性和持久性由事务的redo日志和undo日志来保证&#xff08;1&#xff09;REDO LOG称为重做日志&#xff0c;用来保证事务的持久性&#xff08;2&#xff09;UNDO LOG称为回…