C++第六篇 模板初阶和STL简介

news2024/11/15 7:14:02


目录

一,模板初阶

1.泛型编程

2.函数模板

2.1 函数模板概念

2.2 函数模板格式

2.3 函数模板的原理

2.4 函数模板的实例化

2.5 模板参数的匹配原则

3.类模板(模板类,模板函数)

3.1 类模板定义格式

二,STL简介

1. 什么是STL

2. STL的版本

2.1 原始版本

2.2 P.J.版本

2.3 RW版本

2.4 SGI版本

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

使用函数重载虽然可以实现,但是有一下几个不好的地方:
1. 重载的函数仅仅是类型不同,代码复用率比较低只要有新类型出现时,就需要用户自己增
加对应的函数。

2. 代码的可维护性比较低,一个出错可能所有的重载均出错 。


那能否告诉编译器一个模子,让编译器根据不同的类型利用该模子来生成代码呢?

2.函数模板

2.1 函数模板概念

        函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。

2.2 函数模板格式

template<typename T1, typenameT2,......,typenameTn>

返回值类型 函数名(参数列表){}

例子:

template <class T>
void Swap(const T& x,const T& y)
{
	T temp = x;
	x = y;
	y = temp;
}

typename是用来定义模板参数关键字,也可以使用class。

参数问题

当时只有一个class时,两个参数必须是同一类型

template <class T>
void Swap(const T& x,const T& y)
{
	T temp = x;
	x = y;
	y = temp;
}

int main()
{
	int x1 = 1;
	int x2 = 2;
	double y1 = 3.0;
	double y2 = 4.0;
	Swap(x1, x2);//对
	Swap(y1, y2);//对
	Swap(x1, y1);//错
}

如果想要交换两个不同类型就要写两个class

template <class T1,class T2>
void Swap(const T1& x,const T2& y)
{
	T1 temp = x;
	x = y;
	y = temp;
}
int main()
{
	int x1 = 1;
	int x2 = 2;
	double y1 = 3.0;
	double y2 = 4.0;
	Swap(x1, y1);
	cout << x1 << ' ' << y1 << endl;
}

2.3 函数模板的原理

函数模板是一个蓝图它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具
所以其实模板就是将本来应该我们做的重复的事情交给了编译器。

2.4 函数模板的实例化

用函数模板生成对应的函数,称为函数模板的实例化。模板参数实例化分为:隐式实例化
和显式实例化。

(1). 隐式实例化:让编译器根据实参推演模板参数的实际类型

template <class T>
int Add(const T& x,const T& y)
{
	return x + y;
}
int main()
{
	int x1 = 1;
	int x2 = 2;
	double y1 = 3.0;
	double y2 = 4.0;

// 此时有两种处理方式:1. 用户自己来强制转化 2. 使用显式实例化
	Add(x1, (int)y1);
	cout << x1 << ' ' << y1 << endl;
}

 

(2).显式实例化

在函数名后的<>中指定模板参数的实际类型

template <class T>
int Add(const T& x,const T& y)
{
	return x + y;
}
int main()
{
	int x1 = 1;
	int x2 = 2;
	double y1 = 3.0;
	double y2 = 4.0;
	cout << Add<double>(x1, y1) << endl;
}

2.5 模板参数的匹配原则

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

template <class T>
int Add(const T& x,const T& y)
{
	return x + y;
}

int Add(int a, int b)
{
	cout << "ADD: ";
	return (a + b);
}

int main()
{
	int x1 = 1;
	int x2 = 2;
	double y1 = 3.0;
	double y2 = 4.0;
	cout << Add(x1, y1) << endl;
}

运行结果:

(2). 对于非模板函数和同名函数模板,如果其他条件都相同在调动时会优先调用非模板函数。如果模板可以产生一个具有更好匹配的函数 那么将选择模板

int Add(int left, int right)
{
	cout << "Add1:";
	return left + right;
}
template<class T1, class T2>
T1 Add(T1 left, T2 right)
{
	cout << "Add2:";
	return left + right;
}
void main()
{
	cout << Add(1, 2) << endl; // 与非函数模板类型完全匹配,不需要函数模板实例化
	cout << Add(1, 2.0) << endl; // 模板函数可以生成更加匹配的版本,编译器根据实参生成更加匹配的
}

运行结果:

3.类模板(模板类,模板函数)

3.1 类模板定义格式

template<class T1, class T2, ..., class Tn>
class 类模板名
{
	// 类内成员定义
};

例如:

类模板实现栈

#include<iostream>
using namespace std;
template<typename T>
class Stack
{
public:

	Stack(int n = 4)
		:_array(new T[n])
		, _capacity(n)
		, _size(0)
	{}

	~Stack()
	{
		delete[] _array;
		_array = nullptr;
		_size = _capacity = 0;
	}

	void Push(const T& data)
	{
		if (_size == _capacity)
		{
			T temp = new T[_capacity * 2];
			memcpy(temp, _array, sizeof(T) * _size);

			_array = temp;
			_capacity = _capacity * 2;

		}
		_array[_size++] = data;
	}

private:
	T* _array;
	size_t _capacity; 
	size_t _size;
};

int main()
{
	Stack<int> st1; 
	Stack<double> st2;
	return 0;
}

当声明与定义分离时,要声明模板类

template<typename T>
class Stack
{
public:

	Stack(int 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;
};

template<typename T>
void Stack<T>::Push(const T& data)
{
	if (_size == _capacity)
	{
		T temp = new T[_capacity * 2];
		memcpy(temp, _array, sizeof(T) * _size);

		_array = temp;
		_capacity = _capacity * 2;

	}
	_array[_size++] = data;
}


二,STL简介

1. 什么是STL

STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包含数据结构与算法的软件框架。

2. STL的版本

2.1 原始版本

        Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。 HP 版本--所有STL实现版本的始祖。

2.2 P.J.版本

        由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺陷:可读性比较低,符号命名比较怪异。

2.3 RW版本

        由Rouge Wage公司开发,继承自HP版本,被C+ + Builder 采用,不能公开或修改,可读性一般。

2.4 SGI版本

        由Silicon Graphics Computer Systems,Inc公司开发,继承自HP版 本。被GCC(Linux)采用可移植性好,可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高。我们学习STL主要参考的就是这个版本

3.STL的六大组件


本篇完

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[环境配置]Pycharm:Failed to start [PowerShell.exe]

解决方法&#xff0c;点Local旁边的 号&#xff0c;点击Command Prompt&#xff0c;即可在Pycharm中呼出控制台。 如果要修改Command Prompt的启动时访问的cmd.exe的路径&#xff0c;可以去Settings→Tools→Terminal中&#xff0c;修改Shell Path实现&#xff0c;改为cmd.exe…

「AI绘画Stable Diffusion 零基础入门 」AI 绘画SD原理与工具介绍,万字详解新手入门必看!

大家好&#xff0c;我是设计师阿威 AI 绘画原理 想要入门 AI 绘画&#xff0c;首先需要了解它的原理是什么样的。 其实很早就已经有人基于深度学习模型展开了对图像生成的研究了&#xff0c;但在那时&#xff0c;生成的图像分辨率和内容都非常抽象。 直到近两年&#xff0c…

CentOS 8挂载本地源

CentOS 8挂载本地源 1.虚拟机连接centos镜像2.系统查看centos镜像是否在连接上3. 挂载ISO镜像4.配置YUM源1. 备份现有YUM源配置2. 创建新的YUM源配置文件3. 清理YUM缓存并重新生成 5.验证YUM源 1.虚拟机连接centos镜像 2.系统查看centos镜像是否在连接上 [rootlocalhost ~]# l…

【wiki知识库】07.用户管理后端SpringBoot部分

目录 一、今日目标 二、&#x1f388;SpringBoot部分类的添加 2.1 使用逆向工程新增User模块 2.2 UserQueryParam添加 2.3 UserSaveParam添加 2.4 UserResetPasswordParam添加 2.5 UserQueryVo添加 2.6 SnowFlake工具类 三、&#x1f686;后端新增接口 3.1 /user/li…

【应用层】远程登入管理设备 Telnet

文章目录 Telnet 概述Telnet 认证模式用户等级eNSP 搭建拓扑验证password认证方式登入&#xff08;不支持空密码登入&#xff09;AAA认证方式登入 eNSP连接真机环境配置telnetTelnet 配置命令汇总 Telnet 概述 Telnet是一种基于文本的网络协议&#xff0c;它允许用户通过虚拟终…

PHP开发【石头剪刀布小游戏】

石头剪刀布小游戏 玩法超级简单&#xff0c;你只需要在下面选择石头、剪刀或者布&#xff0c;然后提交&#xff0c;系统就会随机生成电脑的选择&#xff0c;告诉你最终的结果哦&#xff01; 游戏规则&#xff1a; 如果你的选择和电脑一样&#xff0c;那么就是平局。如果你赢…

十一、外观模式

文章目录 1 基本介绍2 案例2.1 Person 类2.2 Computer 类2.3 Player 类2.4 TV 类2.5 StudyManager 类2.6 Client 类2.7 Client 类运行结果2.8 总结 3 各角色之间的关系3.1 角色3.1.1 SubSystem ( 子系统 )3.1.2 Facade ( 窗口 )3.1.3 Client ( 客户端 ) 3.2 类图 4 注意事项5 在…

PointNet点云语义分割

在本教程中&#xff0c;我们将学习如何在斯坦福 3D 室内场景数据集 (S3DIS) 上训练 Point Net 进行语义分割。S3DIS 是一个 3D 数据集&#xff0c;包含来自多栋建筑的室内空间点云&#xff0c;占地面积超过 6000 平方米 [1]。Point Net 是一种新颖的架构&#xff0c;它使用整个…

基于JAVA的陶瓷工厂进销存管理系统的设计与实现

点击下载源码 基于JAVA的陶瓷工厂进销存管理系统的设计与实现 摘 要 时代在进步&#xff0c;我们的生产生活方式当然也要相对应的做出改变了。在今天这样一个信息化的时代&#xff0c;计算机软件已经广泛的被用于日常的办公&#xff0c;仓库的库存管理&#xff0c;企业的人员…

2024年热门开放式耳机评测!悠律、韶音、声阔到底该选谁?

开放式耳机选购技巧篇&#xff0c;可参考选购&#xff01; 作为一名数码评测博主&#xff0c;这两年用过的开放式耳机不下50款了&#xff0c;市面上的开放式耳机众多&#xff0c;很多人不知道该如何选择&#xff0c;其实选购都是有一定的技巧和规律性的&#xff0c;看配置就能…

无损下载器1.1.0.0(3.6M)支持批量下载无损音乐

无损音乐下载器。只有3.6M&#xff0c;简单试了一下感觉非常好用&#xff0c;不知道论坛里发过没有&#xff0c;也不知道作者是谁&#xff0c;非常感谢该软件的开发者&#xff01; 软件标题&#xff1a;无损下载器 版本号&#xff1a;1.1.0.0 使用步骤&#xff1a; 我们下载…

AVL解析

本节主要看板书 概念 AVL树&#xff08;Adelson-Velsky and Landis tree&#xff09;是一种自平衡二叉查找树&#xff0c;用于在动态集合中进行高效的插入、删除和查找操作。它保持树的高度接近最小可能值&#xff0c;从而确保这些操作的时间复杂度始终保持在O(log n)。AVL树…

OS—磁盘和固态硬盘

目录 一. 磁盘二. 磁盘的管理磁盘初始化分区引导块坏块 三. 磁盘调度算法磁盘存取时间磁盘调度算法先来先服务&#xff08;FCFS&#xff09;算法最短寻道时间优先&#xff08;Shorted Seek Time First,SSTF&#xff09;算法扫描&#xff08;SCAN&#xff09;算法LOOK 调度算法循…

30个可以帮程序员查询很多真相的网址

具体请前往&#xff1a;一站式综合查询导航 - 快递物流查询,国际区号查询,车牌号查询,航班动态查询,教育考试成绩和证书、学历、食品药品标准,招投标,知识产权,专利文献,企业信用,法律文书在线查询

13. 基于标定板的lidar到车体的外参标定思路

目录 1. 什么是lidar到车体的外参&#xff1f;2. 为什么要做这个外参矫正&#xff1f;3. 怎么做这个外参矫正&#xff1f;3.1 标定思路3.2 lidar检测标定板上的圆心流程介绍3.3 匹配过程 4. 老乡别走&#xff0c;一起来读书吧 1. 什么是lidar到车体的外参&#xff1f; 在机器人…

猫头虎分享疑难杂Bug:ERROR: No matching distribution found for beautifulsoup4解决方案

&#x1f42f; 猫头虎分享疑难杂Bug&#xff1a;ERROR: No matching distribution found for beautifulsoup4解决方案 摘要 Python开发过程中&#xff0c;ERROR: No matching distribution found for beautifulsoup4 是常见错误之一。本文将详细介绍此错误的产生原因及解决方…

2024最详细的安装教程来了!手把手教你安装Python和PyCharm

最详细的Python安装教程 一、进入Python官网首页&#xff0c;下载最新的Python版本 https://www.python.org/downloads/ 选择最新的Python3.10.5&#xff0c;下载64位的版本 二、下载完成后&#xff0c;进行安装 1.双击Python-3.10.5-amd64.exe 2.选择Customize installation…

入门 PyQt6 看过来(案例)21~ 绘图案例

今天带给大家的是一些绘制图形的案例&#xff0c;第一个是绘制奥运图片&#xff0c;第二个是绘制五角星&#xff0c;第三个是绘制时钟。 1 绘制奥运图片 源码&#xff1a; import sys from PyQt6.QtWidgets import QApplication, QWidget from PyQt6.QtCore import Qt, QRect…

CSS mask-image 实现边缘淡出过渡效果

使用场景 在生产环境中&#xff0c;遇到一个需求&#xff0c;需要在一个深色风格的大屏页面中&#xff0c;嵌入 Google Maps。为了减少违和感&#xff0c;希望地图四边能够淡出过渡。 这里的“淡出过渡”&#xff0c;关键是淡出&#xff0c;而非降低透明度。 基于 Google Ma…

科普文:微服务之Spring Cloud Alibaba组件Nacos一致性协议Distro+Raft概叙

一、概要 Nacos是阿里开放的一款中间件&#xff0c;它主要提供三种功能&#xff1a;持久化节点注册&#xff0c;非持久化节点注册和配置管理。 二、一致性协议 - AP/CP Nacos不是纯粹的AP服务&#xff0c;也不是纯粹的CP服务&#xff0c;而是两者同时支持。 这要从服务注册…