C++:模板初阶与STL简介

news2024/11/27 10:23:02

前言:

上一篇博客我们结束了对C/C++内存管理的学习,这篇让我们继续探索模板初阶与了解STL!

个人主页:Pianeers

文章专栏:C++

如果有问题,欢迎评论区讨论!

希望能帮到大家,求点赞,关注加收藏!

一、模板初阶

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

C++中是否存在模具,通过给这个模具中填充不同材料(类型),来获得不同材料的铸件(即生成具体类型的代码)。这时就提出了泛型编程的概念。

泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。

 1.2函数模板

1.2.1函数模板的概念

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

1.2.2函数模板格式

//typename是用来定义模板参数关键字,也可以使用class
template <typename T1,typename T2,......,typename Tn>
返回类型 函数名(参数列表) {
    // 函数体
}

 举例如下:

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

1.2.3函数模板的实例化

用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化 和显式实例化

隐式实例化

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

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(a, (int)d);
return 0;
}

注意:

①当模板参数只有一个时,传实参时类型应该相同否则报错。

②在模板中,编译器一般不会进行类型转换操作,因为一旦转化出问题,编译器就需要背黑锅。

③此时有两种处理方式:1. 用户自己来强制转化 2. 使用显式实例化

 显式实例化:在函数名后的<>中指定模板参数的实际类型

int main(void)
{
int a = 10;
double b = 20.0;
// 显式实例化
Add<int>(a, b);
return 0;
}

如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错。

1.2.4模板参数的匹配原则

1、如果函数调用的参数列表与非模板函数的参数列表精确匹配,那么将调用非模板函数。

2、如果函数调用的参数列表可以匹配到函数模板的模板参数类型,并且生成一个能够匹配的实例化函数,那么将调用函数模板的实例化版本。

1.3类模板 

除函数模板外,类模板是C++中另一个重要的模板形式,允许定义通用的类,其中的某些成员类型或成员函数可以由用户指定。类模板以 template <typename T> 或 template <class T> 开始,后跟着类的定义,其中 T 是一个占位符类型,表示任意类型。

1.3.1类模板的定义格式

template<class T1, class T2, ..., class Tn>
class 类模板名
{
// 类内成员定义
};
#include<iostream>
using namespace std;
// 类模版
template<typename T>
class Stack
{
public:
Stack(size_t capacity = 4)
{
_array = new T[capacity];
_capacity = capacity;
_size = 0;
}
void Push(const T& data);
private:
T* _array;
size_t _capacity;
size_t _size;
};

注意:模版不建议声明和定义分离到两个文件.h 和.cpp会出现链接错误。

1.3.2类模板的实例化 

类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的 类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。

// Stack是类名,Stack<int>才是类型
Stack<int> st1; // int
Stack<double> st2; // double

二、STL简介

什么是STL?

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

STL的版本:原始版本→→→P. J. 版本→→→RW版本→→→SGI版本。

STL的六大组件:

1. 容器(Containers):包括向量(vector)、链表(list)、双向链表(deque)、栈(stack)、队列(queue)、优先队列(priority_queue)、集合(set)、多重集合(multiset)、映射(map)等。容器用于存储和操作数据,提供了不同的访问方式和操作方法,可以适用于不同的需求。

2. 算法(Algorithms):包括对容器进行排序、搜索、合并、计算等操作的算法,如排序(sort)、查找(find)、求和(accumulate)、复制(copy)等。算法提供了一系列通用的操作方法,可以应用于不同类型的数据和容器。

3. 迭代器(Iterators):迭代器用于遍历容器中的元素,提供了一种统一的访问方式。迭代器可以指向容器中的某个元素,通过迭代器可以读取、修改、删除或插入元素。STL提供了多种类型的迭代器,如输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器等。

4. 分配器(Allocators):分配器用于动态分配和释放内存,可以定制内存分配策略。STL提供了默认的分配器,也允许用户自定义分配器,以满足特定的需求。

5. 函数对象(Function Objects):函数对象是一种类或结构体,重载了函数调用运算符(operator()),使其可以像函数一样被调用。STL中的很多算法和容器都可以接受函数对象作为参数,用于对元素进行处理或比较。

6. 适配器(Adapters):适配器用于将一种容器或迭代器转换为另一种容器或迭代器的接口。STL提供了多个适配器,如栈适配器(stack)、队列适配器(queue)和优先队列适配器(priority_queue)等,可以方便地使用已有容器或迭代器实现其他功能。

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

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

相关文章

数学公式秒变美!2024最新MathType7中文版的魅力功能讲解

MathType 7是一款强大的数学公式编辑器&#xff0c;其中文版本在功能和界面设计上都非常人性化&#xff0c;适合中国用户使用。该软件不仅提供了丰富的数学符号库&#xff0c;还支持手写输入&#xff0c;让用户能够轻松地编辑复杂的数学公式。此外&#xff0c;MathType 7还具有…

Java每日一练:挑战你的编程技能

题目 选自牛客网 1.定义有 StringBuffer s1new StringBuffer(10);s1.append(“1234”)&#xff0c;则s1.length()和s1.capacity()分别是多少? A.4 10 B.4 4 C.10 10 D.10 4 正确答案是A 即s1.length()为4&#xff0c;s1.capacity()为10。 在Java中&#xff0c;StringBuffer…

树莓集团的全球化征程:数字媒体产业的本土与国际布局

在全球数字化转型的浪潮中&#xff0c;树莓集团正稳步推进数字媒体产业从本土到国际的全球化布局。在数字媒体产业这一新兴且充满活力的领域中&#xff0c;树莓集团不仅在国内市场树立了标杆&#xff0c;更以其独特的全球化战略布局&#xff0c;引领着行业的未来趋势。 本土深耕…

【Linux】【系统纪元】Linux起源与环境安装

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《C游记》《进击的C》《Linux迷航》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 一、Linux的起源1.1 计算机硬件1.2 计算机软件 二、Linux的环境安装2.1 安装方式2.2 安装版本2.3 安装过程2.4 远程…

细说工程师如何编写有使用价值的单片机程序(以GPIO为例)

目录 一、何谓有使用价值的单片机程序 二、 硬件板及设计目的 三、建立工程 1.配置GPIO 2.配置时钟源和Debug 3.配置系统时钟 四、代码编写与修改 1.创建应用程序文件夹 2.编写应用文件keyed.h和 keyled. c 3.修改main.c 一、何谓有使用价值的单片机程序 前面我…

Python打开JSON/CSV文件的正确方式(针对UnicodeDecodeError)

前言 我们在使用python的过程中&#xff0c;经常需要它完成一些数据处理的工作&#xff0c;其中尤以json/csv文件为常见。今天&#xff0c;博主针对UnicodeDecodeError异常进行试验&#xff0c;因为这个是新手最容易犯错的地方。 Q&#xff1a;如何应对 UnicodeDecodeError 读…

VMware 设置开机自启动虚拟机

1.虚拟机vmx文件的存储路径 2.快捷键图标&#xff0c;右键–>属性–>快捷方式 3.目标命令里填充 -x “vmx路径” 4.点击&#xff1a;应用–>确定 5.“win键R” 输入shell:startup 6.将启动快捷键复制粘贴到里面

8.6 字符串中等 481 Magical String 522 Longest Uncommon Subsequence II

481 Magical String 像之前那个base &#xff0c;首先对magic string做出分析&#xff0c;才能够分析这道题的规律 读题&#xff1a; //magic string仅包含1 2 并遵循 //串联字符串中 ‘1’ 和 ‘2’ 的连续出现次数可以生成该字符串。concatenating 字符串中的 1 2 contiguous…

java学习--线程基础

概念 程序 进程 线程 单线程与多线程 并发与并行 线程基本使用 基成Tread类 关系图 /* author:我与java相爱相杀---c语言梦开始的地方 今天又是努力学习的一天&#xff01;&#xff01;&#xff01;&#xff01; */public class Main {public static void main(String[] args…

【Android Git】Android项目版本由SVN变成Git

前言 在Android开发环境中&#xff0c;vcs.xml 文件通常与版本控制系统&#xff08;VCS&#xff0c;Version Control System&#xff09;有关&#xff0c;这个文件保存了与版本控制系统相关的配置信息。 以下是 vcs.xml 文件的一些关键点&#xff1a; 版本控制配置&#xff…

Cryptomator-保护你云端上的隐私

网盘为我们提供了随时随地的获取数据的便利性&#xff0c;同时也大大减轻了你我手机电脑空间不足的压力。但是一旦我们选择使用网盘&#xff0c;也意味着把你的私密数据交出去了。 对于公共资料来说&#xff0c;无非就是提供网盘服务的公司知道了你做了保存这些资料的行为而已…

提升用户体验的秘诀:Xinstall带你玩转Web拉起App!

在移动互联网时代&#xff0c;App已成为我们日常生活中不可或缺的一部分。然而&#xff0c;随着App数量的激增&#xff0c;如何让用户更便捷地触达和使用App&#xff0c;成为了开发者和运营者面临的一大挑战。今天&#xff0c;我们就来揭秘一个能够一键实现Web拉起App的神器——…

类和对象(下)C++

1.初始化列表 1.为什么有初始化列表&#xff0c;它的作用&#xff1f; ->初始化列表&#xff0c;是构造函数初始化的另一种形式。 ->在语法上面理解&#xff0c;初始化列表可以认定为是每个成员变量定义初始化的地方. ->引用成员变量&#xff0c;const成员变量&am…

100个免费可商用图库,一次收藏,众生受益

正版图片太贵 免费图片又有风险 免费可商用图片才是设计师心头所好 &#xff08;当然&#xff0c;土豪除外&#xff09; 以下100个免费可商用图库 一次收藏&#xff0c;众生受益! skr&#xff5e;skr&#xff5e;skr&#xff5e; 1、Unsplash https://unsplash.com/ 建…

6个免费的无损音乐下载网站,建议收藏!

分享6个免费的无损音乐下载网站&#xff0c;都是免费的音乐资源&#xff0c;国内外各种风格的音乐都能找到&#xff01; MyFreeMP3 tools.liumingye.cn/music/ 一个免费的mp3音乐下载网站&#xff0c;里面有丰富的音乐资源&#xff0c;支持在线听歌&#xff0c;也可以下载歌…

找出电脑中的视频文件并把地址输出在记事本文件中,同理通过bat脚本找出需要的其他后缀文件,比如word文件excel文件md文件等

下午的时候&#xff0c;突然很着急&#xff0c;要找到一个之前下载的一个视频文件&#xff0c;我记得是mp4格式的视频文件&#xff0c;但是具体叫什么名字不记得了&#xff0c;更不记得在哪个目录下&#xff0c;所以想了一个办法&#xff0c;通过bat脚本命令&#xff0c;找到所…

Hack The Box-Resource【更新中】

总体思路 信息收集&端口利用 nmap -sSVC itrc.ssg.htb目标开放了两个ssh端口和一个80端口&#xff0c;先查看80端口 网站是一个SSG IT资源中心&#xff0c;主要用于解决网站问题、管理 SSH 访问、清除病毒和解决各种安全问题的权威一站式商店。 后台挂着目录扫描&#x…

threejs加载fbx带tga贴图报错

描述&#xff1a;threejs加载带tga贴图的fbx时&#xff0c;提示 FBXLoader: TGA loader not found, creating placeholder texture for 11\Pylons_A.TGA 方案一&#xff1a; 加载fbx之前&#xff0c;在LoadingManager中添加TGALoader。此方案有两个前提 1、FBXLoader和TGALoa…

JDK-Java IO流概述

JDK-Java IO流概述 概述 一直以来Java三件套&#xff08;集合、io、多线程&#xff09;都是最热门的Java基础技术点&#xff0c;我们要深入掌握好这三件套才能在日常开发中得心应手&#xff0c;之前有编写集合相关的文章&#xff0c;这里出一篇文章来梳理一下io相关的知识点。 …