模板初阶及STL简介
目录
一.模板初阶
1.泛型函数
2.函数模板
1.函数模板概念
2.函数模板使用格式
3.函数模板的原理
4.函数模板的实例化
5.模板参数的匹配原则
3.类模板
1.类模板的定义格式
2.类模板的实例化
二.STL简介
1.什么是STL
2.STL的版本
3.STL的六大组件
4.如何学习STL
5.STL的缺陷
一.模板初阶
1.泛型函数
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;
}
当我们想要实现多个功能的交换函数时,我们可以使用重载来解决,虽然重载可以解决,但是有几个不好的地方
- 重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数
- 代码的可维护性比较低,一个出错可能所有的重载均出错
那能否告诉编译器一个模子,让编译器根据不同的类型利用该模子来生成代码呢?
这里我们就可以用到泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础
2.函数模板
1.函数模板概念
函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本
2.函数模板使用格式
template<typename T1, typename T2 ......typename Tn>
返回值类型 函数名(参数列表){}
template<typename T>
void Swap( T& left, T& right)
{T temp = left;left = right;right = temp;
}
注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)
3.函数模板的原理
函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该我们做的重复的事情交给了编译器

在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此
4.函数模板的实例化
用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显式实例化
1.隐式实例化:让编译器根据实参推演模板参数的实际类型
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;Add(a1, a2);Add(d1, d2);/*Add(a1, d1);该语句不能通过编译,因为在编译期间,当编译器看到该实例化时,需要推演其实参类型通过实参a1将T推演为int,通过实参d1将T推演为double类型,但模板参数列表中只有一个T,编译器无法确定此处到底该将T确定为int 或者 double类型而报错注意:在模板中,编译器一般不会进行类型转换操作,因为一旦转化出问题,编译器就需要背黑锅*/// 此时有两种处理方式:1. 用户自己来强制转化 2. 使用显式实例化Add(a1, (int)d1);return 0;
}
2.显式实例化:在函数名后的<>中指定模板参数的实际类型
int main(void)
{int a = 10;double b = 20.0;// 显式实例化Add<int>(a, b);return 0;
}
如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错
5.模板参数的匹配原则
1.一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数
// 专门处理int的加法函数
int Add(int left, int right)
{return left + right;
}// 通用加法函数
template<class T>
T Add(T left, T right)
{return left + right;
}void Test()
{Add(1, 2); // 与非模板函数匹配,编译器不需要特化Add<int>(1, 2); // 调用编译器特化的Add版本
}
2.对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板
// 专门处理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. 模板函数不允许自动类型转换,但普通函数可以进行自动类型转换
3.类模板
1.类模板的定义格式
template<class T1, class T2, ..., class Tn>
class 类模板名
{// 类内成员定义
};
// 动态顺序表
// 注意:Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具
template<class T>
class Vector
{ public:Vector(size_t capacity = 10): _pData(new T[capacity]), _size(0), _capacity(capacity){}// 使用析构函数演示:在类中声明,在类外定义。~Vector();void PushBack(const T& data);void PopBack();// ...size_t Size() {return _size;}T& operator[](size_t pos){assert(pos < _size);return _pData[pos];}private:T* _pData;size_t _size;size_t _capacity;
};// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表
template <class T>
Vector<T>::~Vector()
{if(_pData)delete[] _pData;_size = _capacity = 0;
}
2.类模板的实例化
类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<> 中即可,类模板名字不是真正的类,而实例化的结果才是真正的类
// Vector类名,Vector<int>才是类型Vector<int> s1;Vector<double> s2;
二.STL简介
1.什么是STL
STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架
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.STL的六大组件

4.如何学习STL
学习STL的三个境界:能用,明理,能扩展
5.STL的缺陷
- STL库的更新太慢了。上一版靠谱是C++98,中间的C++03基本一些修订。C++11出来已经相隔了13年,STL才进一步更新
- STL现在都没有支持线程安全。并发环境下需要我们自己加锁。且锁的粒度是比较大的
- STL极度的追求效率,导致内部比较复杂。比如类型萃取,迭代器萃取
- STL的使用会有代码膨胀的问题,比如使用vector/vector/vector这样会生成多份代码,当然这是模板语法本身导致的
相关文章:
模板初阶及STL简介
目录 一.模板初阶 1.泛型函数 2.函数模板 1.函数模板概念 2.函数模板使用格式 3.函数模板的原理 4.函数模板的实例化 5.模板参数的匹配原则 3.类模板 1.类模板的定义格式 2.类模板的实例化 二.STL简介 1.什么是STL 2.STL的版本 3.STL的六大组件 4.如何学习STL …...
UE5 不同的编译模式下,module的组织形式
由于最近在琢磨UE5.4这个引擎,在学习过程中,碰到了一些非常有意思的事情,我在尝试把之前写的一些底层库搬到UE里面,比如底层库,网络库等等,我通过建立module,将这些库用源代码的方式整合进了UE5…...
【ms-swift 大模型微调实战】
安装环境 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simplepip install modelscope vllm ‘ms-swift[llm]’ -U 下载模型 modelscope download --model Qwen/Qwen2.5-7B-Instruct --local_dir ./Qwen2.5-7B-Instruct 微调 实验环境:…...
Linux:网络基础
计算机是人的工具,人需要协作,于是有了网络 专用服务器->专用计算机 局域网:随着计算机的数量增加,通过交换机和路由器连接计算机 广域网:将远隔千里的计算机都连在一起 协议 协议就是约定俗成 计算机之间用光信号…...
mysql 的内连接、左连接、右连接有什么区别?
在MySQL中,内连接、左连接和右连接是三种常见的连接类型,它们用于通过共享一个或多个字段的值,将两个或多个表组合在一起进行查询。以下是这三种连接类型的详细区别: 一、内连接(INNER JOIN) 定义&#x…...
update-alternatives(选择工具)
0 Preface/foreword 1 update-alternatives介绍 1.1 选项和用法 1.2 install用法 update-alternatives --install <link> <name> <path> <priority> [--slave <link> <name> <path>] link:符号链接(软链…...
php解密,sg11解密-sg15解密 如何由sourceGuardian11-sourceGuardian15加密(sg11加密~sg15加密)的源码
sg11加密~sg11加密的PHP文件运行需安装SG11加密-SG15加密组件使用、支持WINDOW及LINUX各版本 sg11解密(SourceGuardian)-sg15解密(SourceGuardian),号称目前最安全的组件加密已可以解密,解密率99.9%,基本可以直接使用,代码特征是…...
b站小土堆PyTorch视频学习笔记(二)
Dataloader:提供不同类型的数据集;为后面的网络提供不同的数据形式 Dataset:提供一种方式去获取数据及其label(标签) 主要实现以下两个功能: {如何获取每一个数据及其lable;告诉我们总共有多少数据} fr…...
Linux的压缩及其解压命令
1、zip文件 压缩 zip linux.zip linux 解压 unzip linux.zip 2、gz文件 压缩 gzip 1.tar 解压 gzip -d 1.tar.gz 3、tar文件(tar可打/解包,压缩/解压文件) 打包 tar -cf 1.rar test 解包 tar -xf 1.tar 解压gz并解包 tar -xjvf archive_name.tar.bz2&#…...
GXYCTF2019:gakki
把题目给的附件解压后给了张图片,顺带着瞟一眼属性,没有值得注意的 binwalk检测一手,看见有个rar压缩包 提取出来的压缩包是有密码的,但是题目并没有给出获取密码的途径,所以先爆破试试,用最常用的四位数爆…...
顺序表(C 语言)
目录 一、线性表二、顺序表1. 静态顺序表2. 动态顺序表2.1 动态顺序表的实现分析2.2 动态顺序表的实现2.3 动态顺序表存在的问题 三、与数组有关的面试题1. 移除元素2. 删除有序数组中的重复项 一、线性表 线性表(linear list)是n个具有相同特性的数据元…...
一:时序数据库-Influx应用
目录 0、版本号 1、登录页面 2、账号基本信息 3、数据库案例 4、可视化 5、java案例 0、版本号 InfluxDB v2.4.0 1、登录页面 http://127.0.0.1:8086/signin 账号:自己账号 密码:自己密码 2、账号基本信息 查看用户id和组织id!&…...
Word文档丢失抢救方法:15 个 Word 文档恢复工具
MS Word 文档恢复的重要性 对于严重依赖 Microsoft Word 创建和编辑文档的个人和企业来说,MS Word 文档恢复是一个至关重要的方面。 文件损坏、系统崩溃和其他意外事件可能会导致 Word 文档中存储的重要数据丢失。 及时恢复这些文档有助于节省时间、精力和资源。 本…...
关于自动驾驶等级相关知识
本文主要介绍自动驾驶等级的一下知识,在介绍之前,首先要介绍一些基本知识,然后介绍自动驾驶不同等级 1、自动驾驶相关知识 监控和判断(OEDA):指对车辆周围的物体和事件进行检测和感知,并给出应…...
Java中跳转结构
在Java中,跳转结构用于控制程序的执行流程。 2.4.1 break 用途: 用于终止当前循环(for、while、do-while)或switch语句。 public class BreakExample {public static void main(String[] args) {for (int i 0; i < 10; i) {if (i 5) …...
CNN-Attention分类预测 | Matlab实现多特征分类预测
CNN-Attention分类预测 | Matlab实现多特征分类预测 目录 CNN-Attention分类预测 | Matlab实现多特征分类预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现CNN-Attention卷积神经网络融合注意力机制多特征分类预测,运行环境Matlab2023b及以上…...
[java][基础]JSP
目标: 理解 JSP 及 JSP 原理 能在 JSP中使用 EL表达式 和 JSTL标签 理解 MVC模式 和 三层架构 能完成品牌数据的增删改查功能 1,JSP 概述 JSP(全称:Java Server Pages):Java 服务端页面。是一种动态的…...
《测绘学报》
《测绘学报》 办刊宗旨:尊重科学、弘扬学术、追求卓越、求实创新。60多年来,《测绘学报》作为承载着测绘地理信息科学技术和科研成果的载体,作为测绘地理信息行业人才培养和学术交流的阵地,坚持把学术论文的质量放在期刊工作的重要…...
代码随想录之链表刷题总结
目录 1.链表理论基础 2.移除链表元素 3.设计链表 4.翻转链表 5.两两交换链表中的节点 6.删除链表中的第N个节点 7.链表相交 8.环形链表 1.链表理论基础 链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域…...
Python爬虫的“京东大冒险”:揭秘商品类目信息
开篇:欢迎来到Python的奇幻森林 在这个数据驱动的时代,我们就像一群探险家,穿梭在数字的森林中,寻找着隐藏的宝藏——商品类目信息。今天,我们将带领你一起,用Python这把锋利的剑,深入京东的神…...
Google I/O 2026最魔幻的一幕:发新模型的同时,Google砍了自己的CLI
5月19号凌晨,我刚躺下准备刷会儿手机睡觉,结果被朋友圈刷屏了。 Google I/O 2026,总共两个小时的 keynote,愣是让我看到凌晨两点。不是因为我有多敬业,而是信息量实在太大——大到我觉得不记下来,明天就忘了…...
【2026电赛国奖秘籍】别再用L298N了!无刷电机FOC(位置/速度双环)速成与避坑指南
📝 前言:为什么电赛控制类一定要懂FOC?参加过电赛控制类(如自平衡小车、双轴追光云台、风力摆、倒立摆)的同学都知道,传统的“直流有刷电机 L298N/TB6612 增量式编码器”方案在面对极低速运转和精确定位时…...
数据类型与变量-Part1-基础篇
C语言数据类型与变量(基础篇) 系列导航 📍 Part 1: C语言数据类型与变量(基础篇)← 你在这里🔜 Part 2: C语言内存探秘(进阶篇)🔜 Part 3: C语言输入输出格式化艺术 大家…...
别再被‘pip不是内部命令’搞懵了!Python新手必看的pip安装与修复保姆级教程(附ensurepip用法)
Python包管理革命:从pip失效到ensurepip的深度实践指南 为什么你的pip命令突然"罢工"了? 刚接触Python的新手们常常会遇到一个令人抓狂的问题——昨天还能正常使用的pip命令,今天突然提示"不是内部或外部命令"。这就像突…...
HS2-HF Patch:如何用5分钟为HoneySelect2实现完整汉化与MOD整合
HS2-HF Patch:如何用5分钟为HoneySelect2实现完整汉化与MOD整合 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch HS2-HF Patch是HoneySelect2玩家的终…...
使用 Taotoken 管理多个 API Key 并设置访问权限与审计
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用 Taotoken 管理多个 API Key 并设置访问权限与审计 在开发和集成大模型应用时,一个常见的需求是为不同的应用、环境…...
2026年geo优化五强厂商技术与服务体系全维度盘点
在生成式 AI 全面接管信息入口的今天,究竟什么是 geo优化,它与传统的搜索排名逻辑有何本质区别?面对流量红利枯竭与 AI 搜索的双重夹击,企业布局 geo优化 的商业紧迫性体现在哪里,不做会面临怎样的增长困境?…...
从URP到Built-in:手把手教你迁移Unity第三人称模板并成功换人(解决Shader报错)
从URP到Built-in:Unity第三人称模板迁移全流程实战指南 当你在Unity中打开官方提供的Third Person模板,准备将其应用到自己的项目时,可能会遇到一个棘手的问题——这个模板是基于URP(Universal Render Pipeline)设计的…...
三分钟完成Taotoken的API Key配置与curl调用测试
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 三分钟完成Taotoken的API Key配置与curl调用测试 基础教程类,面向刚注册Taotoken并获取了API Key的开发者,…...
实战指南:高效部署企业级网络监控系统ElastiFlow的完整方案
实战指南:高效部署企业级网络监控系统ElastiFlow的完整方案 【免费下载链接】elastiflow Network flow analytics (Netflow, sFlow and IPFIX) with the Elastic Stack 项目地址: https://gitcode.com/gh_mirrors/el/elastiflow ElastiFlow是一款基于Elastic…...
