【C++】模版初阶+STL简介

目录
- 前言
- 💥1、函数模版
- 💥1.1 函数模板概念
- 💥1.2 函数模板格式
- 💥1.3 函数模板的原理
- 💥1.4函数模版实例化
- 💥1.5模版参数的匹配原则
- 💥2、类模版
- 💥2.1类模版的定义格式
- 💥2.2类模板的实例化
- 💥3、STL简介
- 💥3.1 什么是STL
- 💥3.2 STL的版本
- 💥3.3 STL六大组件
- 💥3.4如何学习STL
- 总结
前言
如果有一个模具,通过给这个模具中填充不同材料(类型),来获得不同
材料的铸件(生成具体类型的代码),那我们将会方便很多。
泛型编程:允许函数和数据结构使用任何数据类型,而不需要为每种数据类型编写重复的代码。模板是泛型编程的基础。
💥1、函数模版
💥1.1 函数模板概念
函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。
💥1.2 函数模板格式
template<class / typename T1,......,class / typename Tn>
typename用来定义模板参数关键字,也可以使用class,typename更贴切,但class更常见。
以交换函数为例:
template<class T>
void Swap(T& x, T& y)
{T z = x;x = y;y = z;
}
💥1.3 函数模板的原理
函数模板是一个蓝图,它本身并不是函数,是编译器使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该我们做的重复的事情交给了编译器。

在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。
比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码。
💥1.4函数模版实例化
用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显式实例化。
- 隐式实例化:编译器根据实参推演模板参数的实际类型
template<class T>
T Add(const T& x, const T& y)
{return x + y;
}int main()
{int a1 = 1;int a2 = 2;double d1 = 1.1;double d2 = 2.2;Add(a1, a2);Add(d1, d2);return 0;
}
- 显示实例化:在函数明后的
<>中指定模版参数的实际类型
template<class T>
T Add(const T& x, const T& y)
{return x + y;
}int main()
{int a = 1;double d = 1.1;Add<int>(a, d);Add<double>(a, d);return 0;
}
如果类型不同:
template<class T>
T Add(const T& x, const T& y)
{return x + y;
}int main()
{//编译错误//编译器无法确定此处到底该将T确定为int 或者 double类型而报错//Add(a1, d2);Add(a1, (int)d2);//强转Add<int>(a1, d2);//显示实例化
}
💥1.5模版参数的匹配原则
- 一个非模版函数可以和一个同名的函数模版同时存在,而且该函数模版还可以被实例化为这个非模版函数
#include <iostream>
using namespace std;//专门处理int的加法函数
int Add(const int& x, const int& y)
{return x + y;
}//通用加法函数
template<class T>
T Add(const T& x, const T& y)
{return x + y;
}int main()
{Add(1, 2);//与非模版函数匹配,编译器不需要特化Add<int>(1, 2);//调用编译器特化的Add版本return 0;
}
- 对于非模版函数和同名函数模版,如果其他条件都相同,在调动时会优先调用非模版函数而不会从模版产生一个实例。如果模版可以产生一个具有更好匹配的函数,那么将选择模版
#include <iostream>
using namespace std;//专门处理int的加法函数
int Add(const int& x, const int& y)
{return x + y;
}//通用加法函数
template<class T1, class T2>
T1 Add(const T1& x, const T2& y)
{return x + y;
}int main()
{Add(1, 2);//与非模版函数匹配,编译器不需要特化Add(1, 2.2);//模版函数可以生成更加匹配的版本,编译器根据//实参生成更加匹配的Add函数return 0;
}
💥2、类模版
💥2.1类模版的定义格式
template<class T1, class T2, ..., class Tn>
class 类模板名
{
// 类内成员定义
};
下面以栈为例:
#include <iostream>
#include <string.h>
using namespace std;// 类模版
template<class T>
class Stack
{
public:Stack(size_t n = 4):_array(new T[n]), _capacity(n),_size(0){}~Stack(){delete[] _array;_array = nullptr;_size = _capacity = 0;}void Push(const T& data);//...private:T* _array;size_t _capacity;size_t _size;
};//模版不建议声明和定义分离到两个文件.h 和.cpp会出现链接错误
//模版参数只能给当前的函数或者类使用
template<class T>
void Stack<T>::Push(const T& data)
{if (_size == _capacity){//手动地异地扩容T* tmp = new T[2 * _capacity];memcpy(tmp, _array, sizeof(T) * _size);delete[] _array;_array = tmp;tmp = nullptr;_capacity *= 2;}_array[_size++] = data;
}int main()
{Stack<int> st1;st1.Push(1);st1.Push(2);st1.Push(3);Stack<char> st2;st2.Push('a');st2.Push('b');st2.Push('c');return 0;
}
- 模版不建议声明和定义分离到两个文件.h 和.cpp,会出现链接错误
- 模版参数只能给当前的函数或者类使用
- 栈空间不足时需要我们手动异地扩容
💥2.2类模板的实例化
类模版都是显示实例化,类模板名字不是真正的类,而实例化的结果才是真正的类。
// Stack是类名,Stack<int>才是类型
Stack<int> st1; // int
Stack<double> st2; // double
Stack是类名,Stack<int>才是类型
💥3、STL简介
💥3.1 什么是STL
STL(standard template libaray-标准模板库)是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。
💥3.2 STL的版本
- 原始版本
Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。 HP 版本–所有STL实现版本的始祖。 - P. J. 版本
由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺陷:可读性比较低,符号命名比较怪异。 - RW版本
由Rouge Wage公司开发,继承自HP版本,被C+ + Builder 采用,不能公开或修改,可读性一般。 - SGI版本
由Silicon Graphics Computer Systems,Inc公司开发,继承自HP版 本。被GCC(Linux)采用,可移植性好,可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高。
💥3.3 STL六大组件

💥3.4如何学习STL
STL是C++中的优秀作品,它让我们站在前人的肩膀上,迅速发展。有人说:“不懂STL,不要说你会C++”。
学习STL的三层境界:
- 第一层:熟用STL
- 第二层:了解泛型技术的内涵与STL的学理乃至实作
- 第三层:扩充STL
总结
- 模板是一种有效的代码组织和复用机制,使得编写通用和灵活的程序成为可能,能够帮助开发者简化代码并提高效率。
- STL是基于模板的,这意味着它是类型无关的。开发者可以用任何符合要求的数据类型(如基本数据类型、用户定义类型等)来使用STL提供的容器和算法,从而提高了代码的灵活性。
相关文章:
【C++】模版初阶+STL简介
🚀个人主页:奋斗的小羊 🚀所属专栏:C 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 前言💥1、函数模版💥1.1 函数模板概念💥1.2 函数模板格式💥1…...
Vue3中的toRef和toRefs的区别和用法
刚做了Ref和Reactive区别及使用方法笔记,再来总结一下,toRef 和 toRefs 的作用、用法、区别 1、作用和区别 toRef 和 toRefs 可以用来复制 reactive 里面的属性然后转成 ref,而且它既保留了响应式,也保留了引用,也就…...
【docker快捷部署系列一】docker快速入门,安装docker,解决运行Docker Quickstart Terminal出错
1、docker快速入门 视频链接 知识点概述 docker是轻量级虚拟机image是镜像 相当于虚拟机快照container是容器,相当于运行起来的虚拟机程序Dockerfile 是创建docker镜像的自动化脚本docker-compose 是一个定义和运行多个容器命令的工具,包括运行Docker…...
vulnhub靶机实战_DC-8
一、靶机下载 靶机下载链接汇总:https://download.vulnhub.com/使用搜索功能,搜索dc类型的靶机即可。本次实战使用的靶机是:DC-8系统:Debian下载链接:https://download.vulnhub.com/dc/DC-8.zip 二、靶机启动 下载完…...
如何做到项目真实性优化?保姆级写简历指南第五弹!
大家好,我是程序员鱼皮。做知识分享这些年来,我看过太多简历、也帮忙修改过很多的简历,发现很多同学是完全不会写简历的、会犯很多常见的问题,不能把自己的优势充分展示出来,导致措施了很多面试机会,实在是…...
Python Beautiful Soup介绍
在Web数据抓取和网页解析的世界里,Python以其简洁的语法和丰富的库资源成为了许多开发者的首选语言。而Beautiful Soup,作为Python中一个强大的HTML和XML解析库,更是以其易用性和灵活性赢得了广泛的赞誉。本文将带你走进Beautiful Soup的世界…...
NDI Tools汉化版的安装
目录 一、安装包下载 二、安装英文版 三、安装汉化版 NDI(Network Device Interface)即网络设备接口,是由美国 NewTek 公司开发的免费标准,它可使兼容的视频产品以高质量、低延迟、精确到帧的方式通过网络进行通讯、传输和接收广播级质量的视频,非常适合在现场直播制作…...
【JAVA多线程】AQS,JAVA并发包的核心
目录 1.概述 1.1.什么是AQS 1.2.AQS和BlockQueue的区别 1.3.AQS的结构 2.源码分析 2.1.CLH队列 2.2.模板方法的实现 2.2.1.独占模式 1.获取资源 2.释放资源 2.2.2.共享模式 1.概述 1.1.什么是AQS AQS非常非常重要,可以说是JAVA并发包(java.…...
springcloud loadbalancer nacos无损发布
前言 故事背景 jenkins部署时总是会有几秒钟接口调用报错,观察日志是因为流量被下发到已下线的服务,重启脚本在停止应用之前先调用nacos注销实例api后再重启依然会短暂出现此问题。项目架构是springcloud alibaba,通过openfeign进行微服务之间调用&…...
React原理
函数式编程 一种编程范式,概念比较多纯函数不可变值vdom和diff Vue2.x Vue3.x React 三者实现vdom细节都不同核心概念和实现思路,都一样h函数 用来生成vnode的函数 vnode数据结构 {tag: div,props: {className: div-class},children: [{tag: p,children: 测试}, ...] }pat…...
React-Native优质开源项目
React Native是由Facebook开发的一种开源框架,它允许开发者使用JavaScript和React编写原生应用,提供了一套跨平台的UI组件,可以在iOS和Android上实现一致的用户体验。在React Native的生态系统中,有许多优质的开源项目,…...
Ajax-02
一.form-serialize插件 作用:快速收集表单元素的值 const form document.querySelector(.example-form) const data serialize(form,{hash:true,empty:true}) *参数1:要获取哪个表单的数据 表单元素设置name属性,值会作为对象的属性名 建议…...
供应商较多的汽车制造业如何选择供应商协同平台?
汽车制造业的供应商种类繁多,根据供应链的不同环节和产品特性,可以大致分为以下几类。 按供应链等级分包括: 一级供应商通常具有较高的技术水平和生产能力,能够满足汽车厂商对零部件的高品质、高性能和高可靠性的要求。 二级供应…...
【开端】JAVA Mono<Void>向前端返回没有登陆或登录超时 暂无权限访问信息组装
一、绪论 JAVA接口返回信息ServerHttpResponse response 等登录接口token过期时需要给前端返回相关状态码和状态信息 二、Mono<Void>向前端返回没有登陆或登录超时 暂无权限访问信息组装 返回Mono对象 public abstract class Mono<T> implements CorePublisher…...
Python(模块---pandas+matplotlib+pyecharts)
import pandas as pd import matplotlib.pyplot as plt dfpd.read_excel(简易数据.xlsx) # print(df) plt.rcParams[font.sans-serif][SimHei] #设置画布的大小 plt.figure(figsize(10,6)) labelsdf[电影中文名] ydf[国籍] # print(labels) # print(y)# import pandas as pd im…...
解决使用Navicat连接数据库时,打开数据库表很慢的问题
今天使用Navicat连接数据库时,发现不管表中数据多少,打开数据库表非常慢。 解决方法: Navicat - 右键编辑数据库连接 - 高级 - 勾选保持连接间隔 - 输入框设置为20 - 点击确定! 参考文章:https://51.ruyo.net/14030.…...
nginx重启报错nginx: [error] invalid PID number
nginx重启报错nginx: [error] invalid PID numb 解决亲测有用 问题描述解决方式 问题描述 编译安装完 nginx 后,启动 nginx时,出现nginx已经在运行,然后输入 ./nginx -s reload时,出现了 nginx: [error] invalid PID number “” in “/us…...
人工智能深度学习系列—深度学习中的相似性追求:Triplet Loss 全解析
人工智能深度学习系列—深度解析:交叉熵损失(Cross-Entropy Loss)在分类问题中的应用 人工智能深度学习系列—深入解析:均方误差损失(MSE Loss)在深度学习中的应用与实践 人工智能深度学习系列—深入探索KL…...
26. Hibernate 如何自动生成 SQL 语句
1. 前言 本节和大家一起聊聊 Hibernate 是如何自动生成 SQL 语句的。通过本节的学习,你将了解到: 反射在框架中的重要性;元数据描述对 Hibernate 的重要性。 2. 理想状态 Hibernate 是全自动的 JDBC 框架,能自动构建 SQL 语句、…...
预言机(Oracle machine)
预言机(Oracle machine)是一个在多个领域中有不同应用和解释的概念。以下是从不同角度对预言机的详细解析: 一、计算复杂度理论与可计算性理论中的预言机 在计算复杂度理论与可计算性理论中,预言机是一种抽象电脑,用…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
