波奇学C++:模板和STL

news2025/1/23 9:22:28

什么是模板?为什么我们需要模板?

先假设一个场景,我们要编写一个函数交换a,b两个数的值

void swap(int& a,int& b)
{
    int cmp=a;
    a=b;
    b=a;
}

swap函数可以帮我们交换两个int型的值,那如果要交换的类型是float,double类型呢?

当然我们可以选择函数重载,使它支持多个数据类型。

void swap(float& a,float& b);
void swap(double& a,double& b);
......

可是这就意味着我们就要编写大量重复的代码。

有没有一种方法可以优化这个过程,少写代码有能实现重载?

模板(template)是一种语法,是为了优化重载而产生的。

模板分为函数模板和类模板

这里我们先讲函数模板

template <typename T> //模板参数T T可以被实例化int,double等类型

void swap(T& x1,T& x2)
{
    T tmp=x1;
    x1=x2;
    x2=tmp;
}

int main()
{
    int a=0; b=1;
    double c=1.1,d=2.2;
    swap(a,b);//1;
    swap(c,d);//3.3
    return 0;
}

这样无论是int,float,int*,double,都可以使用

模板的实现原理:

模板类比成类,类实例化后才能使用,模板实例化重载函数被调用,因此swap(a,b)和swap(c,d)调用的不是void swap(T& x1,T& x2);而是void swap(T& x1,T& x2)产生的void swap(int x1,int x2), void swap(double x1, double x2)这两个函数。

得出结论:两次调用不是调用同一个函数,而是模版产生的同一函数。

泛型编程

当我们用模板进行编程时,函数针对的就不是某一种类型,而是广泛的类型,因此用模板编程方式也叫泛型编程。

模板的语法

template<typename T>//可以替换为template<class T>
//temppalte 关键字
void Swap(T& x, T& y)
{
	T tmp = x;
	x = y;
	y = tmp;
}

T可以是自定义类型吗?可以

和atuo有关吗? 虽然都有自动识别类型的意思但不是一样的

T是固定的吗? 不是,T可以替换成T1,T2

x,y可以是不同类型吗?可以的

x,y可以充当返回值吗?可以的

模板的显式实例化

当x,y是不同类型时,会报错

temeplate<class T>
T Add(contst T& x,const T& y)
{
    return a+b;
}
int main()
{
    int a=0;
    double b=0;
    cout<<Add(a,b)<<endl;
}

T是int还是double型

用显示实例化来指定返回类型

ccout<<<int>Add(a,b)<<endl;

T就是int 返回值就是int型。相当于指定了T的类型,这就是显式实例化。

显式实例化更常用于指定栈的空间

T* fun(T n)
{
    return new a[n];
}

int*p =<int> fun(n);

相当于T 被替换为int。

类模板

template<class T>
class A
{
public:
    A()
    {
        _array=new T[capacity];
    }
private:
    T* _arry;
}

A<int> a;

类模板只能显式实例化。

类模板的声明定义分离

template<class T>
class A
{
public:
    A()
    {
        _array=new T[capacity];
    }
    void value();
private:
    T* _arry;
    int a=0;
}

template<class T>
void A<T>::value()
{
    return a;
}
A<int> a;
类外每个函数都要重写一遍template<class T>
函数的类型是A<T>,对于普通类,类名和类型是一样的,对于这个模板类,类名是A,类型是A<T>

 STL:STL是什么?

STL是包罗数据结构和算法的软件框架。

以前用c的时候,我们要写二叉树,我们只能手搓一个,但是有人替换我们写好了树,图等多种数据结构,放在了STL中,我们只有调用STL的数据结构就行了。

STL六大组件

 以String为例,什么是String?

String 是一个类里面包含成员变量和成员函数,String是用一个类来表示字符串,成员变量和成员函数提供了多种操作字符串的形式。字符串由C的char*,char []变成了String对象表示方式。 

学习string打开 cplusplus.com - The C++ Resources Network ​​​​​​

 搜索类string,查看字符串的构造函数

int main()
{
	string s1();//空字符串
	string s2(10,'x');//"xxxxxxxxxx"
	string s3("abcdef");//"abcdef"
	string s4(s2);//copy s4
}

 

+=运算符重载是为了使得字符串有拼接的属性

s2 += s3;//"xxxxxxxxxxabcdef"

学习STL的关键是学习文档的用法,利用学习的类和重载符的知识来更好地理解STL。 

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

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

相关文章

基础篇010.1 STM32驱动RC522 RFID模块之一:基础知识

目录 1. RFID概述 1.1 RFID工作原理 1.2 RFID分类 1.3 RFID模块 1.4 RFID卡片 1.5 IC卡和ID卡介绍 1.6 IC卡和ID的区分 2. Mifare卡结构原理 2.1 Mifare卡概述 2.2 Mifare非接触式 IC 卡性能简介&#xff08;M1&#xff09; 2.2.1 Mifare S50与Mifare S70 2.2.2 S5…

操作系统的发展史

█ DOS操作系统 上期提到&#xff0c;20世纪70年代&#xff0c;伴随着计算机技术的成熟&#xff0c;操作系统也进入了一个快速发展阶段。现代操作系统的概念&#xff0c;也在那一时期逐渐形成。 1975年初&#xff0c;MITS电脑公司推出了基于Intel 8080芯片的Altair 8800微型计算…

7 种常见的路由协议

网络路由是网络通信的重要组成部分&#xff0c;通过互联网将信息从源地址移动到目的地的过程。路由发生在 OSI 模型的第 3 层&#xff08;网络层&#xff09;。实际网络中通常会将静态和动态路由结合使用。静态路由适用于小型网络&#xff0c;而动态路由适用于大型网络。 什么…

Office project 2013安装

哈喽&#xff0c;大家好。今天一起学习的是project 2013的安装&#xff0c;Microsoft Office project项目管理工具软件&#xff0c;凝集了许多成熟的项目管理现代理论和方法&#xff0c;可以帮助项目管理者实现时间、资源、成本计划、控制。有兴趣的小伙伴也可以来一起试试手。…

Anthropic 推出 Claude ,一款与ChatGPT竞争的聊天机器人

最近&#xff0c;谷歌承诺向 Anthropic 投资 3 亿美元&#xff0c;收购这家初创公司 10% 的股份。 Anthropic 是一家由前 OpenAI 员工共同创立的初创公司&#xff0c;近日推出一款与ChatGPT对标的产品。 Anthropic 名为 Claude 的人工智能聊天机器人&#xff0c;可以被指示执行…

【Zero to One系列】window系统安装Linux、docker

1、在window系统安装Linux&#xff08;开启微软的Linux子系统功能-WSL&#xff09; 1.1 什么是WSL&#xff1f; 传送门&#xff1a;适用于 Linux 的 Windows 子系统安装指南 (Windows 10) 链接里有全部的步骤 1.2 开启 WSL 在 控制面板-->程序和功能 页面找到 Windows 功…

【运维知识进阶篇】Ansible自动化运维-PlayBook详解

这篇文章给大家介绍下PlayBook&#xff0c;我们叫它剧本&#xff0c;它是以一种固定的格式&#xff0c;将多个ad-hoc放入yml文件中。在Ansible中&#xff0c;剧本文件是yml结尾的&#xff0c;在SaltStack中剧本文件是sls结尾的&#xff0c;但是两者语法都是使用的yaml语法。 P…

军用电子元器件质量如何界定?

为了保证元器件的质量&#xff0c;我国制定了一系列的元器件标准。在上世纪70年代末期制定了“七专”7905技术协议和80年代初制定了“七专”8406技术协议&#xff0c;已具备了军用器件标准的雏形&#xff0c;但标准是在改革开放之前制定的&#xff0c;有很多局限性&#xff0c;…

Studio One6简体中文版全新版本功能详解

Studio One 6是一款强大的音乐编曲软件,可以帮助您使用灵活的和弦轨道功能实现音乐创作。通过新的智能模板、直观的拖放工作流、可定制的用户界面和强大的集成工具&#xff0c;使创建快速而轻松。 无论你选择 Studio One 哪个版本&#xff0c;你都可以得到无限的音轨、通道和插…

ChatGPT强到离谱,这么十一款ChatGPT浏览器插件你值得拥有

&#x1f517; 运行环境&#xff1a;ChatGPT &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f9…

【ChatGPT功能挖掘】论文绘图救星!

前言 &#x1f497;未来全网粉丝100W、全栈领域优质创作者、掘金、阿里云等社区博客专家、专注于全栈领域和毕业项目实战&#x1f497; 今天分享一个使用ChatGPT来解决绘图没有思路、不知如何下手的问题&#xff01; 注意看&#xff01;全文干货&#xff0c;无废话&#xff01…

路径规划 | 图解RRT*算法(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 图解RRT*算法原理2 ROS C算法实现3 Python算法实现4 Matlab算法实现 0 专栏介绍 &#x1f525;附C/Python/Matlab全套代码&#x1f525;课程设计、毕业设计、创新竞赛必备&#xff01;详细介绍全局规划(图搜索、采样法、智能算法等)&#xff1b;局部规划(DWA…

chatgpt赋能python:使用Numpy在Python中进行科学计算

使用Numpy在Python中进行科学计算 对于需要进行科学计算和数据分析的程序员&#xff0c;Python是一个非常有用的编程语言。而Numpy&#xff08;Numerical Python&#xff09;则是Python生态系统中最受欢迎和广泛使用的科学计算库之一。该库提供了高效的数组操作&#xff0c;线…

跟着我学 AI丨知识图谱,搜索的根

搜索是现在大家都很熟悉的功能&#xff0c;同时也是我们搜集信息离不开的重要手段。而搜索之所以能帮助我们获取到对应的信息&#xff0c;其实离不开知识图谱的重要支撑。知识图谱是什么呢&#xff1f;为什么能够支撑起搜索的提升呢&#xff1f;今天我们就来认识一下知识图谱。…

36从零开始学Java之到底什么是方法的重载?

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 壹哥在之前给大家讲解构造方法的时候说过&#xff0c;在一个类中&#xff0c;可以定义多个构造方法&a…

老胡的周刊(第092期)

老胡的信息周刊[1]&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 &#x1f3af; 项目 chathub[2] ChatHub 是款全能聊天机器人客户…

Kubernetes最佳实战案例:优化容器化部署与扩展性

▲ 点击上方"DevOps和k8s全栈技术"关注公众号 Kubernetes&#xff08;简称为K8s&#xff09;作为目前最流行的容器编排平台&#xff0c;为企业提供了强大的容器管理和自动化部署能力。在实践中&#xff0c;许多组织已经成功地应用了Kubernetes来提高应用程序的可靠性…

旗舰手机割不动年轻人了,纷纷降价千元贱卖,苹果也未能幸免

618促销即将开启&#xff0c;而手机企业的促销优惠更早&#xff0c;在5月中旬就已开始&#xff0c;苹果率先降价1200元促销&#xff0c;随即国产手机第一大品牌跟进&#xff0c;苹果再反击&#xff0c;如今国产手机开始全面降价&#xff0c;就连最顽强的某国产手机品牌也开始跟…

自动化测试之JUnit单元测试框架

目录 一、什么是 JUnit 二、JUnit5 相关技术 1.注解 1.1 Test 1.2 Disabled 1.3 BeforeAll、AfterAll 1.4 BeforeEach、AfterEach 2.参数化 2.1 单参数 2.2 CSV 获取参数 2.3 方法获取参数 2.4 多参数 3.测试用例的执行顺序 3.1 顺序执行&#xff1a;TestMethodO…

应收账款天数和应付账款天数和现金比率和速动比率

应收账款和应付账款天数 应收账款天数计算公式为&#xff1a; 应收账款天数 平均应收账款 * 360 除以 销售额 应收账款天数&#xff08;DOS&#xff09;显示公司需要多少天才能从客户那里收回账款&#xff0c;所以应收账款天数增加的时候&#xff0c;表明应收账款管理出现恶化…