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

C++【模板STL简介】

文章目录

  • C++模板&&STL初阶
  • 一、泛型编程
  • 二、函数模板
    • 2.1.函数模板概念
    • 2.2.函数模板格式
    • 2.3.函数模板的实例化
    • 2.4.模板参数的匹配原则
  • 三、 类模板
    • 3.1.模板的定义格式
    • 3.2.类模板的实例化
  • STL简介
  • 一、STL的概念、组成及缺陷
  • 二、STL的版本

C++模板&&STL初阶

一、泛型编程

所谓泛型编程,就是不依赖于某一具体类型而使代码具有很强适应性的编程范式。是代码复用的一种手段。模板是泛型编程的基础。我们可以用函数重载来实现。
如图下面代码:

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;
}

从上面看以看出使用函数重载虽然可以实现,但是有缺陷:
1.重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数。
2. 代码的可维护性比较低,一个出错可能所有的重载均出错。
解决方法是告诉编译器一个模板,让编译器根据不同的类型利用该模子来生成代码。
如果在C++中,能够存在这样一个模具,通过给这个模具中填充不同材料(类型),来获得不同材料的铸件(即生成具体类型的代码),那将会节省许时间。
模板分为两种:函数模板和类模板。

二、函数模板

2.1.函数模板概念

函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。
函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该我们做的重复的事情交给了编译器

2.2.函数模板格式

template<typename T1, typename T2,…,typename Tn>
返回值类型 函数名(参数列表){}
typename是用来定义模板参数关键字,也可以使用class(不能使用struct代替class)。

template<typename T>
void Swap( T& a, T& b)
{T temp = a;a = b;b = a;
}

原理分析:
在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以提供调用。并不是调用同一个函数比如:当用int类型使用函数模板时,编译器通过对实参类型的推演,将T确定为int类型,然后产生一份专门处理int类型的代码,对于double和char类型等也是一样。

2.3.函数模板的实例化

用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显式实例化。
1.隐式实例化:让编译器根据实参推演模板参数的实际类型。

template<class T>
T Add(const T& a, const T& b)
{
return a + b;
}
int main()
{int a1 = 1, a2 = 2;double b1 = 1.0, b2= 2.0;Add(a1, a2);//1Add(b1, b2);//2Add(a1,b2);//3return 0;
}

执行1和2会正常运行,而执行3的时候会报错,如图:
在这里插入图片描述
因为在编译期间,当编译器看到该实例化时,需要推演其实参类型
通过实参a1将T推演为int,通过实参把b2将T推演为double类型,但模板参数列表中只有一个T,编译器无法确定此处到底该将T确定为int 或者 double类型而报错。在模板中,编译器一般不会进行类型转换操作。解决两种方法:1. 用户自己来强制转化 2. 使用显式实例化
2.显式实例化:在函数名后的<>中指定模板参数的实际类型、
比如以上可以这样改:Add(a, b);

2.4.模板参数的匹配原则

1.一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数。

    int Add(int a, int b){return a+b;}template<class T>T Add(T a, T b){return a+b;}int main(){Add(1, 2); // 1Add<int>(1, 2); // 2}      

执行1时 与非模板函数匹配,编译器不需要实例化。
执行2时调用编译器实例化的Add版本。

2. 对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板, 也就是说编译器会调用成本低的

 int Add(int a, int b){return a+b;}template<class T>T Add(T a, T b){return a+b;}int main(){Add(1, 2); //1Add(1, 2.0);//2}      

执行1时,它 与非函数模板类型完全匹配,不需要函数模板实例化。
执行2时,模板函数可以生成更加匹配的版本,编译器根据实参生成更加匹配的Add函数。
模板函数不允许自动类型转换,但普通函数可以进行自动类型转换。

三、 类模板

3.1.模板的定义格式

在C++中规定如果一个类被声明为类模板,那么其中的所有成员函数就都成为了模板函数。
类模板格式:
template<class T1, class T2, …, class Tn>
class 类模板名
{
// 类内成员定义
};
如下图:

template<class T>
class Stack
{
public:Stack(int capaicty = 4){_a = new T[capaicty];_top = 0;_capacity = capaicty;}~Stack()private:T* _a;size_t _top;size_t _capacity;
};template <class T>Stack<T>::~Stack(){delete[] _pData;_size = _capacity = 0;}int main(){Stack st1; Stack st2; vector<int> c;for (size_t i = 0; i < c.size(); ++i){cout << c[i] << " ";}return 0;
}

Stack不是具体的类,是编译器根据被实例化的类型生成具体类的模具。类模板中函数放在类外进行定义时,需要加模板参数列表

3.2.类模板的实例化

类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。
对于Stack st1,和 Stack st2,如何同时做到一个存int类型,一个存double类型,就可以用类模板,并显示实例化,而且类模板只能显示实例化。如下:

         Stack<int> st1; Stack<double> st2; 

STL简介

一、STL的概念、组成及缺陷

概念
STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包含数据结构与算法的软件框架。
组成
有六大组件:
1.仿函数:greater,less…
2.空间配置器:allocator
3.算法:find,swap,reverse,sort,merge…
4.容器:string,vector,list,deque,map,set,multimap,mutiset
5.迭代器:iterator,const_irerator,reverse_iretator,const_reverse_iterator
6.配接器:stack,queue,priority_queue
缺陷

  1. STL库的更新太慢,上一版靠谱是C++98,中间的C++03基本一些修订。C++11出来已经相隔了13年,STL才进一步更新。
  2. STL现在都没有支持线程安全。并发环境下需要我们自己加锁。且锁的力度是比较大的。
  3. STL极度的追求效率,导致内部比较复杂。比如类型萃取,迭代器萃取。
  4. STL的使用会有代码膨胀的问题,比如使用vector/vector/vector这样会生成多份代码,当然这是模板语法本身导致的。

STL用途前景
网上总说:“不懂STL,不要说你会C++”。STL是C++中的优秀作品,有了它的陪伴,许多底层的数据结构以及算法都不需要自己重新造轮子,站在前人的肩膀上,健步如飞的快速开发。
学习STL的三个境界:熟练用,明底层,能扩展 。

二、STL的版本

1.原始版本
Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。 HP 版本–所有STL实现版本的始祖。
2.P. J. 版本
由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺陷:可读性比较低,符号命名比较怪异。
3.RW版本
由Rouge Wage公司开发,继承自HP版本,被C+ + Builder 采用,不能公开或修改,可读性一般。
4.SGI版本
由Silicon Graphics Computer Systems,Inc公司开发,继承自HP版 本。被GCC(Linux)采用,可移植性好,可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高。我们后面学习STL要阅读部分源代码,主要参考的就是这个版本。

相关文章:

C++【模板STL简介】

文章目录C模板&&STL初阶一、泛型编程二、函数模板2.1.函数模板概念2.2.函数模板格式2.3.函数模板的实例化2.4.模板参数的匹配原则三、 类模板3.1.模板的定义格式3.2.类模板的实例化STL简介一、STL的概念、组成及缺陷二、STL的版本C模板&&STL初阶 一、泛型编程…...

该学会是自己找bug了(vs调试技巧)

前言 &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f; c语言初阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>:介绍c语言初阶的最后一篇.有关调试的重要性. 金句分享…...

Redis大全(概念与下载安装)

目录 一、概念 1.非关系型数据库&#xff08;NoSQL&#xff09;的介绍 2.什么是redis 3.redis的作者 4.Redis的特点 5.redis的应用场景 6.高度概括知识 一、二 缓存穿透、缓存击穿、缓存雪崩的概念 &#xff08;一&#xff09;缓存穿透 &#xff08;二&#xff09;缓…...

指针的进阶【上篇】

文章目录&#x1f4c0;1.字符指针&#x1f4c0;2.指针数组&#x1f4c0;3.数组指针&#x1f4bf;3.1.数组指针的定义&#x1f4bf;3.2. &数组名VS数组名&#x1f4bf;3.3.数组指针的使用&#x1f4c0;1.字符指针 int main() {char ch w;char* pc &ch;// pc就是字符指…...

MATLAB | 如何用MATLAB绘制花里胡哨的山脊图

本期推送教大家如何绘制各种样式的山脊图&#xff0c;这里做了一个工具函数用来实现好看的山脊图的绘制&#xff0c;编写不易请多多点赞&#xff0c;大体绘制效果如下&#xff1a; 依旧工具函数放在文末。 教程部分 0 数据准备 数据为多个一维向量放在元胞数组中&#xff0c;…...

.Net与程序集

一个简单的C#程序回想一下我们第一个.net 程序 hello world&#xff0c;它具有那些步骤呢&#xff1f;打开visual studio创建一个C# console的项目build运行程序这时候就有一个命令行窗口弹出来&#xff0c;上面打印着hello world。我们打开文件夹的bin目录&#xff0c;会发现里…...

软考中级之数据库系统(重点)

涉及考点:数据库模式,ER模型,关系代数与元祖演算,规范化理论,并发控制,分布式数据库系统,数据仓库和数据挖掘 数据库模式 三级模式-二级映射 常考选择题 三级模式,两种映射的这种涉及属于层次架构体的设计,这种设计为我们在应用数据库的时候提供了很多便利,同时提高了整个体…...

界面控件DevExtreme的Data Grid组件——让业务信息管理更轻松!

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序&#xff0c;该套件附带功能齐…...

【架构师】零基础到精通——网关策略

博客昵称&#xff1a;架构师Cool 最喜欢的座右铭&#xff1a;一以贯之的努力&#xff0c;不得懈怠的人生。 作者简介&#xff1a;一名退役Coder&#xff0c;软件设计师/鸿蒙高级工程师认证&#xff0c;在备战高级架构师/系统分析师&#xff0c;欢迎关注小弟&#xff01; 博主小…...

【java 8】方法引用与构造器引用

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…...

SGI 空间配置器

前言 空间配置器是 STL 六大组件之一&#xff0c;它总是隐藏在容器的背后&#xff0c;默默工作&#xff0c;默默付出。本文为《STL 源码剖析》读书笔记&#xff0c;主要讨论 SGI 版本空间的配置和释放&#xff0c;对代码进行解读时会改变一些写法&#xff0c;使其更易于阅读。…...

2023年白酒行业研究报告

第一章 行业概况 白酒是中国传统的酿酒业之一&#xff0c;历史悠久&#xff0c;源远流长。白酒指以高粱等粮谷为主要原料&#xff0c;以大曲、小曲或麸曲及酒母等为糖化发酵剂&#xff0c;经蒸煮、糖化、发酵、蒸馏、陈酿、勾兑而制成的&#xff0c;酒精度(体积分数)在18%-68%…...

华为OD机试 -合规数组(Java) | 机试题+算法思路+考点+代码解析 【2023】

合规数组 题目 给定一个正整数数组 检查数组中是否存在满足规则的数组组合 规则: A = B + 2C 输入 第一行输出数组的元素个数 接下来一行输出所有数组元素,用空格隔开 输出 如果存在满足要求的数 在同一行里依次输出规则里A B C的取值,用空格隔开 如果不存在输出0 示…...

华为OD机试真题Python实现【英文输入法】真题+解题思路+代码(20222023)

英文输入法 主管期望你来实现英文输入法单词联想功能,需求如下: 依据用户输入的单词前缀,从已输入的英文语句中联想出用户想输入的单词。按字典序输出联想到的单词序列,如果联想不到,请输出用户输入的单词前缀。注意 英文单词联想时区分大小写缩略形式如"don’t&quo…...

改进YOLO系列 | 添加轻量化Decouple_Head 和 ASFF_Head

绿色为ASFF_Head,浅蓝色Decoupled_Head,深蓝色是第三步加的_initialize_dh_biases方法后的效果。 参数量与计算量对比 模型参数量 parameters计算量GFLOPsyolov5s_Head723538916.5ASFF_Head1267484725.0Decoupled_Head892869722.0结构图 本篇介绍的这个Decouple_Head和YOLOX…...

LLFlow沦为和代码解读

LLFlow沦为和代码解读 1.测试时代码的运行位置 sr&#xff1a;什么意思 sr 和 z 这里又将模型设置为了训练模式 所以下面这部分代码应该是测试时运行的所有代码 这个就是测试时使用的网络模型框架 下面应该就是self.netG的网络模型框架 但是这个z的网络模型框架代码还不…...

C语言学习及复习笔记-【9】数组

目录9. 数组9.1 数组的定义9.2 数组与指针的区别9.3 数组大小计算9.4 数组的赋值9.5多维数组寻址方式9.6 函数数组9. 数组 9.1 数组的定义 C 语言支持数组数据结构&#xff0c;它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据&#xff0c;但它往往…...

Kubernetes入门教程 --- 使用kubeadm进行集群安装

Kubernetes入门教程 --- 使用kubeadm和二进制安装1. Introduction1.1 架构图1.2 关键字介绍1.3 简述2. 使用Kubeadm Install2.1 申请三个虚拟环境2.2 准备安装环境2.3 配置yum源2.4 安装Docker2.5 时间同步2.6 安装组件2.7 部署集群2.8 Master安装网络插卡3. 查询状态3.1 查询n…...

华为OD机试真题Python实现【相对开音节】真题+解题思路+代码(20222023)

相对开音节 题目 相对开音节构成的结构为辅音+元音(aeiou)+辅音(r除外) 常见的单词有bike cake 给定一个字符串,以空格为分隔符 反转每个单词的字母 若单词中包含如数字等其他非字母时不进行反转 反转后计算其中含有相对开音节结构的子串个数 (连续子串中部分字符可以重复) …...

海思SD3403/SS928V100开发(5)MIPI_YUV相机vio sample开发----修改思路

1. 前言 sensor输出格式: YUV422 8bit 硬件连接: MIPI_YUV相机(4lane MIPI) -> SS928V100 MIPI0(4lane) 框图: 2. 几个问题 基于SS928 SDK中的 vio sample修改; 但是sample里面都是基于RAW RGB sensor开发的sample, 没有现成的MIPI_YUV sensor的参考,需要自己…...

topcode【随机算法题】【2026.5.24打卡-java版本】

最长有效括号 要点&#xff1a;栈&#xff0c;push下标 class Solution {public int longestValidParentheses(String s) {//栈//放前哨-1Deque<Integer> stack new ArrayDeque<>();stack.push(-1);int ans 0;for(int i 0; i < s.length(); i){char c s.…...

信创环境运维实录:在离线ARM麒麟V10服务器上,我是这样搞定telnet客户端的

信创环境下的离线运维实战&#xff1a;ARM架构麒麟V10服务器telnet客户端部署全解析在信创产业快速推进的背景下&#xff0c;越来越多的企业和机构开始采用国产化服务器操作系统。麒麟V10作为国产操作系统的代表之一&#xff0c;凭借其安全可靠的特性&#xff0c;在政府、金融、…...

WABT实战指南:用wasm-decompile精准逆向WebAssembly

1. 为什么你打开一个.wasm文件看到的全是乱码&#xff0c;而别人却能读出函数名和逻辑&#xff1f; WABT&#xff08;WebAssembly Binary Toolkit&#xff09;不是个“点开即用”的图形化工具&#xff0c;它是一套命令行驱动的底层解析引擎——这恰恰是它在逆向分析场景中不可…...

初识递归算法

目录介绍例PythonC原理优缺点分析题目结尾本文由Jzwalliser原创&#xff0c;发布在CSDN平台上&#xff0c;遵循CC 4.0 BY-SA协议。 因此&#xff0c;若需转载/引用本文&#xff0c;请注明作者并附原文链接&#xff0c;且禁止删除/修改本段文字。 违者必究&#xff0c;谢谢配合。…...

开源可穿戴系统HARNode:低成本高精度人体活动识别方案

1. 项目概述&#xff1a;开源可穿戴系统如何革新人体活动识别研究在人体活动识别&#xff08;HAR&#xff09;研究领域&#xff0c;我们长期面临一个尴尬局面&#xff1a;实验室里的算法准确率动辄宣称99%&#xff0c;但一到真实场景就频频失灵。问题根源在于——研究者们往往只…...

Unity 2020.3.3f1c1 + MySQL:手把手教你搞定餐厅经营游戏的登录注册与房间联机(附完整源码)

Unity餐厅经营游戏开发实战&#xff1a;从登录注册到联机房间的完整架构解析在独立游戏开发领域&#xff0c;餐厅经营类游戏因其轻松愉快的玩法和社交属性&#xff0c;始终保持着稳定的市场需求。本文将深入探讨如何基于Unity 2020.3.3f1c1构建一个完整的餐厅经营游戏框架&…...

计算机工程投稿经历(2026年5月份录用)

本篇文章记录自己的投稿经历然后一些投稿心得。相信大家完成自己初稿的时候都不知道如何去选择期刊&#xff0c;我也是一样。根据自己的稿件研究方向可以快速筛选期刊&#xff0c;最好的方法就是在知网搜索与自己稿件相关主题相关的文章&#xff0c;本人研究方向是深深度学习方…...

告别昂贵定位器!用Python和PyTorch复现DCL-Net,实现无传感器3D超声重建

告别昂贵定位器&#xff01;用Python和PyTorch复现DCL-Net实现无传感器3D超声重建在医学影像领域&#xff0c;3D超声重建技术正逐步改变传统诊断方式。想象一下&#xff0c;医生只需手持普通超声探头自由扫描&#xff0c;AI系统就能自动将二维切片合成为三维立体图像——这正是…...

避坑指南:处理NOAA海温数据时,关于陆地掩膜、时间解析和面积加权的三个常见错误

NOAA海温数据处理实战&#xff1a;避开陆地掩膜、时间解析与面积加权的三大陷阱当分析NOAA OISST海温数据时&#xff0c;许多研究者会不自觉地掉进几个技术陷阱——这些错误看似微小&#xff0c;却足以让整个分析结果偏离真实。我曾亲眼见过一位同行因为忽略纬度权重校正&#…...

LangGraph 状态存储优化:处理大规模多智能体数据的高效方案

LangGraph 状态存储优化:处理大规模多智能体数据的高效方案 本文面向有LangGraph开发经验、需要落地大规模多智能体应用的开发者,从底层原理、架构设计到代码实现全方位讲解如何将LangGraph状态存储的性能提升10倍、成本降低80%,支撑10万+级多智能体并发运行。 引言 痛点引…...