【C++】6.模板初阶
交换两个数 任何一个类型交换还要重新写一个函数 如何解决?
模板->写跟类型无关的函数
1.泛型编程
泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。
如何写一个函数适用所有类型的交换?
#include <iostream>
using namespace std;template<class T>
//template<typename T> //模板参数 -> 类型
void Swap(T& x1, T& x2)
{T x = x1;x1 = x2;x2 = x;
}//下面调用的是否是同一个函数
//不是
//这里我们不能调用函数模板 调用的是函数模板
//实例化生成的对应类型的函数
int main()
{int a = 0, b = 1;Swap(a, b);double c = 1.11, d = 2.22;Swap(c, d);char e = 'a', f = 'b';Swap(e, f);cout << a << " " << b << endl << c << " " << d << endl << e << " " << f << endl;return 0;
}
2.函数模板
1°概念
函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。
2°格式
template<typename T1, typename T2,......,typename Tn> 返回值类型 函数名(参数列表){}
3°原理
在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。
比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。
4°实例化
写了模板后调用 -> 实例化
int x1,x2;
swap(x1,x2); void swap(int& a,int& b)
double x3,x4;
swap(x3,x4); void swap(double& a,double& b)
stack<int> st1; class stack{int* _a;...}
stack<double> st2; class stack{double* _a;...}
用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显式实例化。
- 隐式实例化
- 显式实例化
template<class T>
T& Add(const T& left, const T& right)
{return left + right;
}int main()
{int a1 = 10, a2 = 20;double d1 = 10.0, d2 = 20.0;// 隐式实例化 (T的类型是编译器自己推导的)Add(a1, a2);Add(d1, d2);//T要么全int 要么全double//Add(a1, d1);//解决//1.强转:Add(a1, (int)d1);//2.显示实例化(指定T的类型)//类模板也是这样Add<int>(a1, d1);return 0;
}
显示实例化:类似于Add 指定了类型
5°模板的匹配
- 一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数
//专门处理int的加法函数 外卖
int Add(int left, int right)
{return left + right;
}// 通用模板 自己做
template<class T>
T& Add(const T& left, const T& right)
{return left + right;
}void main()
{Add(1, 2); //与非模板函数匹配 编译器不需要特化 大家都会优先选择点外卖Add<int>(1, 2); //调用编译器特化的Add版本 指定了自己做
}
- 对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板.
//专门处理int的加法函数
int Add(int left, int right)
{return left + right;
}
// 通用加法函数
template<class T1, class T2>
T1 Add(T1 left, T2 right)
{return left + right;
}
void Test()
{Add(1, 2); // 与非函数模板类型完全匹配,不需要函数模板实例化Add(1, 2.0); // 模板函数可以生成更加匹配的版本,编译器根据实参生成更加匹配的Add函
数
}
- 模板函数不允许自动类型转换,但普通函数可以进行自动类型转换
3.类模板
#include <iostream>
#include <assert.h>
using namespace std;template<class T>
class vector // 动态增长的数组
{
public:vector():_a(nullptr),_size(0),_capacity(0){}~vector(){delete[] _a;_a = nullptr;_size = _capacity = 0;}//类里面声明 类外面定义void push_back(const T& x);//可以引用传 减少拷贝void pop_back();//[]重载 直接拿到下标为i的元素 调用的时候就和遍历数组一样T& operator[](size_t i){assert(i < _size);return _a[i];}//遍历数组size_t size(){return _size;}
private:T* _a;size_t _size;size_t _capacity;
};//类外面定义写出类型vector<T>::
//与类分离了 再写一次模板
template<class T>
void vector<T>::push_back(const T& x)
{//如果空间不够 需要进行增容if (_size == _capacity){size_t newcapacity = _capacity == 0 ? 2 : _capacity * 2;T* tmp = new T[newcapacity];if (_a){//拷贝memcpy(tmp, _a, sizeof(T) * _size);//如果本身不为空 销毁原来空间delete[] _a;}//指向新的扩容空间_a = tmp;_capacity = newcapacity;}//放元素_a[_size] = x;//调整++_size;
}template<class T>
void vector<T>::pop_back()
{assert(_size > 0);--_size;
}int main()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.pop_back();for (size_t i = 0; i < v.size(); ++i){//[]写 v.operator[](i);//如果传值返回 返回值给到v[i] 会拷贝临时变量 具有常性 不可改//而且改变的是临时变量 不是原来的值//传引用返回可以解决问题 返回的是引用别名//引用传参:1.修改传递的实参 比如swap 2.减少拷贝//引用传返回值:1.修改返回对象如operator[] 2.减少拷贝v[i] *= 2;}for (size_t i = 0; i < v.size(); ++i){//[]读cout << v[i] << " ";}cout << endl;return 0;
}
实例化:
Vector s1;
Vector s2;
【C++】6.模板初阶 完
相关文章:
【C++】6.模板初阶
交换两个数 任何一个类型交换还要重新写一个函数 如何解决? 模板->写跟类型无关的函数 1.泛型编程 泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。 如何写一个函数适用所有类型的交换? #include &…...
Docker部署Airbyte
Linux环境部署前置要求机器配置2c4g(最低),4c8g(推荐)dockerdocker-compose (要求新版本的docker-compose)安装airbyte,打开终端,进入你想安装airbyte的目录。#Clone代码 git clone https://github.com/air…...
2023王道考研数据结构笔记第一章绪论
第一章 绪论 1.1 数据结构的基本概念 1.数据:数据是信息的载体,是描述客观事物属性的数、字符以及所有能输入到计算机中并被程序识别和处理的符号的集合。 2.数据元素:数据元素是数据的基本单位,通常作为一个整体进行考虑和处理…...
告别空指针让代码变优雅,Optional使用图文例子源码解读
一、前言 我们在开发中最常见的异常就是NullPointerException,防不胜防啊,相信大家肯定被坑过! 这种基本出现在获取数据库信息中、三方接口,获取的对象为空,再去get出现! 解决方案当然简单,只…...
【C++】哈希——unordered系列容器|哈希冲突|闭散列|开散列
文章目录一、unordered系列关联式容器二、哈希概念三、哈希冲突四、哈希函数五、解决哈希冲突1.闭散列——开放定址法2.代码实现3.开散列——开链法4.代码实现六、结语一、unordered系列关联式容器 在C98中,STL提供了底层为红黑树结构的一系列关联式容器,…...
mysql-面试
锁: mysql的锁分为全局锁、表锁、行锁、间隙锁 全局锁:Flush tables with read lock 可以全局设计库为只读 表锁:一种是表锁,一种是元数据锁(meta data lock,MDL) lock tables t1 read,t2 wi…...
【夏虫语冰】Win10局域网下两台电脑无法ping通: 无法访问目标主机
文章目录1、简介2、修改高级共享设置3、启用防火墙规则4、局域网内的其他主机访问NAT模式下的虚拟机4.1 虚拟机网络设置4.2 访问测试4.2.1 http测试4.2.2 curl测试4.2.3 telnet测试4.2.4 端口占用测试5、其他结语1、简介 ping 192.168.31.134ping主机ip时,访问无法…...
大数据框架之Hadoop:MapReduce(三)MapReduce框架原理——Join多种应用
3.7.1Reduce Join 1、工作原理 Map端的主要工作:为来自不同表或文件的key/value对,打标签以区别不同来源的记录。然后用连接字段作为key,其余部分和新加的标志作为value,最后进行输出。 Reduce端的主要工作:在Reduc…...
SSRF漏洞原理、危害以及防御与修复
一、SSRF漏洞原理漏洞概述SSRF(Server-side Request Forge,服务端请求伪造)是一种由攻击者构造形成由服务端发起请求的安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。正是因为它是由服务端发起的,所…...
CV学习笔记-ResNet
ResNet 文章目录ResNet1. ResNet概述1.1 常见卷积神经网络1.2 ResNet提出背景2. ResNet网络结构2.1 Residual net2.2 残差神经单元2.3 Shortcut2.4 ResNet50网络结构3. 代码实现3.1 Identity Block3.2 Conv Block3.3 ResNet网络定义3.4 整体代码测试1. ResNet概述 1.1 常见卷积…...
百亿数据,毫秒级返回查询优化
近年来公司业务迅猛发展,数据量爆炸式增长,随之而来的的是海量数据查询等带来的挑战,我们需要数据量在十亿,甚至百亿级别的规模时依然能以秒级甚至毫秒级的速度返回,这样的话显然离不开搜索引擎的帮助,在搜…...
cpp之STL
STL原理 STL ⼀共提供六⼤组件,包括容器,算法,迭代器,仿函数,适配器和空间配置器,彼此可以组合套⽤。容器通过配置器取得数据存储空间,算法通过迭代器存取容器内容,仿函数可以协助算…...
基于Spring Boot开发的资产管理系统
文章目录 项目介绍主要功能截图:登录首页信息软件管理服务器管理网络设备固定资产明细硬件管理部分代码展示设计总结项目获取方式🍅 作者主页:Java韩立 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目…...
Markdown总结
文字的着重标记与段落的层次划分 Tab键可以缩进列表; shift Tab:取消缩进列表 加粗(****)、斜体(**)高亮:xxx$$:特殊标记删除:~~xxx~~多级标题:######无序列…...
字节跳动软件测试岗4轮面经(已拿34K+ offer)...
没有绝对的天才,只有持续不断的付出。对于我们每一个平凡人来说,改变命运只能依靠努力幸运,但如果你不够幸运,那就只能拉高努力的占比。 2021年10月,我有幸成为了字节跳动的一名测试工程师,从外包辞职了历…...
docker - 搭建redis集群和Etcd
概述 由于业务需要,需要把之前的分布式架构调整成微服务,把老项目迁移到k8s的服务中,再开始编码之前,需要再本地环境里做相应的准备工作,使用docker搭建redis集群,Etcd主要是注册本地的rpc服务。 Liunx O…...
Java程序开发中如何使用lntelliJ IDEA?
完成了IDEA的安装与启动,下面使用IDEA创建一个Java程序,实现在控制台上打印HelloWorld!的功能,具体步骤如下。 1.创建Java项目 进入New Project界面后,单击New Project选项按钮创建新项目,弹出New Project对话框&…...
【Linux】理解进程地址空间
🍎作者:阿润菜菜 📖专栏:Linux系统编程 我们在学习C语言的时候,都学过内存区域的划分如栈、堆、代码区、数据区这些。但我们其实并不真正理解内存 — 我们之前一直说的内存是物理上的内存吗? 前言 我们…...
Unity脚本 --- 常用API(类)--- GameObject类 和
第一部分 --- GameObject类 1.在Hierarchy 层级面板中添加游戏物体其实就相当于在场景中添加游戏物体 2.每一个场景都有一个自己的Hierarchy层级面板,用来管理场景中的所有游戏物体 3.是的,我们可以创建多个场景 1.首先上面这两个变量都是布尔变量&am…...
HTML标签——表格标签
HTML标签——表格标签 目录HTML标签——表格标签一、表格标题和表头单元格标签场景:注意点:案例实操小结二、表格的结构标签场景:注意点:案例实操:三、合并单元格思路场景:代码实现一、表格标题和表头单元格…...
Telerik JustMock 2023 R1 Crack
Telerik JustMock 2023 R1 Crack 制作单元测试的最快、最灵活和模拟选项。 Telerik JustLock也很简单,可以使用一个模拟工具来帮助您更快地生成更好的单元测试。JustLock使您更容易创建对象并建立对依赖关系的期望,例如,互联网服务需求、数据…...
筑基八层 —— 问题思考分析并解决
目录 零:移步 一.修炼必备 二.问题思考(先思考) 三.问题解答 零:移步 CSDN由于我的排版不怎么好看,我的有道云笔记相当的美观,请移步有道云笔记 一.修炼必备 1.入门必备:VS2019社区版&#x…...
【面试题】当面试官问 Vue2与Vue3的区别,你该怎么回答?
大厂面试题分享 面试题库后端面试题库 (面试必备) 推荐:★★★★★地址:前端面试题库被问到 《vue2 与 vue3 的区别》应该怎么回答Vue 内部根据功能可以被分为三个大的模块:响应性 reactivite、运行时 runtime、编辑器…...
使用Python对excel中的数据进行处理
一、读取excel中的数据首先引入pandas库,没有的话使用控制台安装 —— pip install pandas 。import pandas as pd #引入pandas库,别名为pd#read_excel用于读取excel中的数据,这里只列举常用的两个参数(文件所在路径ÿ…...
TCP协议原理三
文章目录七、延时应答八、捎带应答九、面向字节流粘包问题十、TCP异常情况总结七、延时应答 如果说滑动窗口的关键是让窗口大一些,传输速度就快一些。那么延时应答就是在接收方能够处理的前提下,尽可能把ack返回的窗口大小尽可能大一些。 如果在接受数据…...
mac在命令行里获取root权限
1、为什么要获取root权限? 答:一些命令在正常状态下没有权限会报错,只有获取了root权限才能正常操作。 比如我们想修改一些系统的文件: vim /etc/shells 1 修改后保存,发现没权限,报错了。如下图…...
文献阅读 Improving Seismic Data Resolution with Deep Generative Networks
题目 Improving Seismic Data Resolution with Deep Generative Networks 使用深度生成网络提高地震数据分辨率 摘要 叠前数据的使用,通常可以来解决噪声迹线、覆盖间隙或不规则/不适当的迹线间距等问题。但叠前数据并不总是可用的。作为替代方案,叠后…...
mysql数据库之子查询练习
1、查询员工的姓名、年龄、职位、部门信息(隐式内连接)。 #emp、dept #连接条件:emp.dept_iddept.id select e.name,e.age,e.job,d.name from emp e,dept d where e.dept_idd.id; 2、查询年龄小于30岁的员工姓名、年龄、职位、部…...
西电计算机通信与网络(计网)简答题计算题核心考点汇总(期末真题+核心考点)
文章目录前言一、简答计算题真题概览二、网桥,交换机和路由器三、ARQ协议四、曼彻斯特编码和差分曼彻斯特编码五、CRC六、ARP协议七、LAN相关协议计算前言 主要针对西安电子科技大学《计算机通信与网络》的核心考点进行汇总,包含总共26章的核心简答。 【…...
【博学谷学习记录】超强总结,用心分享丨人工智能 Python基础 个人学习总结之列表排序
目录前言简述list.sort()语法返回值实例无参参数key参数reversesorted()语法返回值实例无参参数key参数reverseoperator.itemgetter功能简述实例List.sort与sored区别sorted原理:Timsort算法扩展list原理数据结构心得前言 经过一周的学习,对Python基础部…...
建立网站教程视频/汕头网站建设方案推广
随着信息技术的发展,计算机在我们的日常生活中扮演了越来越重要的作用,通过现有的技术以及当今在计算机领域还在研究中的尖端科技分析,计算机的发展将趋向超高速、超小型、平行处理和智能化,量子、光子、分子和纳米计算机将具有感知、思考、判…...
多人在线协作网站开发/网络广告宣传怎么做
1. 导读源于之前的一篇文章,盛夏计划: 助小白极简入坑数据分析, 这半个月多前,我吹下的牛,现在不睡觉也要把他撸完,你说对吧?。。虽然是极简教程,但是也会拆成几篇文章, 为什么&…...
网站基本要素/佛山seo优化外包
写在前面 本文严禁转载,只限于学习交流。课件分享在这里了。还有人工智能标准化白皮书(2018版)也一并分享了。 文章目录绪论人工智能的定义与发展定义起源与发展各种认知观目前人工智能主要有以下三个学派:几种学派各自不足之处:研究目标与内…...
商城网站 前置审批/深圳网站快速排名优化
题目描述 R国和 S国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动。历尽艰险后,潜伏于 S国的 R 国间谍小 C终于摸清了 S 国军用密码的编码规则: 1. S 国军方内部欲发送的原信息经过加密后在网络上…...
做外贸网站效果图/最近三天的新闻热点
Percona集群制定的服务器节点如下: node #1 hostname: pzsd01 IP: 10.1.11.14node #2 hostname: pzsd02 IP: 10.1.11.15node #3 hostname: pzsd03 IP: 10.1.11.16*先决条件 *所有节点都是安装了Linux CentOS 6.4 *防火墙关闭 *selinux disabled *安装部署percona和e…...
ps做网站的常用素材/学电商出来一般干什么工作
去年的一加7 Pro在市场上反应良好,因为其加大投入与创新,搭载了2K 90Hz屏幕,让一加7 Pro成为真旗舰。但是直到现在,一加现有机型上依然缺失了一个大多数旗舰标配的功能,无线充电。此前刘作虎曾多次回答过这个问题&…...