波奇学C++:模板和STL

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

先假设一个场景,我们要编写一个函数交换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.mfbz.cn/a/23849.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【linux解压和打包文件】

TOC 打包成zip文件 指令 zip zip -r -q -o html.zip html/ -r 参数表示递归打包包含子目录的全部内容&#xff0c;-q 参数表示为安静模式&#xff0c;即不向屏幕输出信息&#xff0c;-o 表示输出文件&#xff0c;需在其后紧跟打包输出文件名。解压zip文件 1.unzip -q …

【HMS Core】【ML Kit】活体检测FAQ合集

【问题描述1】 使用示例代码集成活体检测SDK时&#xff0c;报错state code -7001 【解决方案】 使用示例代码前请详细阅读示例工程中的“README”文件。您需要完成以下操作后才可以运行示例代码。 在AppGallery Connect网站下载自己应用的“agconnect-services.json”文件&a…

服务(第三十二篇)nginx做缓存服务器

nginx作为缓存服务配置语法 1、proxy_cache_path 配置语法&#xff08;即缓存路径配置语法&#xff09; Syntax&#xff1a;proxy_cache_path path [levelslevels] [use_temp_pathon|off] keys_zonename:size [inactivetime] [max_sizesize] [manager_filesnumber] [manager_s…

深度学习常用名词解析

深度学习&#xff1a; 英文DL(Deep Learning),指多层的人工神经网络和训练它的方法。一层大量的神经网络会把大量的矩阵数字作为输入&#xff0c;通过非线性激活方法获取权重&#xff0c;再产生另一个数据集和作为输出。 Epoch&#xff1a; 在模型训练的时候含义是训练集中的…

减肥瘦身自律APP软件开发功能有哪些?

减肥瘦身是很多女人一生都在奋斗的目标&#xff0c;如果找不对方法&#xff0c;减肥效果事倍功半还可能会反弹&#xff0c;所以越来越多的人推崇健康科学的减肥理念&#xff0c;把瘦身的重心转移到饮食和运动管理上&#xff0c;于是市场上出现了减肥瘦身自律类的APP软件&#x…

vue实现二维码识别功能 读取二维码内容

我们可以访问 https://www.wwei.cn/?frombdtp 在输入框中输入文本 然后 点击生成二维码 他就会给我生成一个对应信息的二维码图片 我们可以复制到本地 打开vue项目 先引入依赖 npm install canvas jsqr然后组件编写代码如下 <template><div><input type&qu…

数据结构-查找(顺序查找与二分查找的讲解与代码实现)

顺序查找概念&#xff1a;从表的另一端开始&#xff0c;一次将记录的关键字和给定值进行比较&#xff0c;若某个记录的关键字和给定的值相等&#xff0c;则查找成功&#xff0c;反之则查找失败。 ASL:平均查找长度 pi查找概率&#xff0c;ci查找次数 eg&#xff1a;序列1&…

二分搜索树层序遍历

二分搜索树的层序遍历&#xff0c;即逐层进行遍历&#xff0c;即将每层的节点存在队列当中&#xff0c;然后进行出队&#xff08;取出节点&#xff09;和入队&#xff08;存入下一层的节点&#xff09;的操作&#xff0c;以此达到遍历的目的。 通过引入一个队列来支撑层序遍历…

Git简单使用介绍

Git作用 版本控制&#xff08;版本迭代&#xff09;&#xff0c;多人开发&#xff0c;没有版本控制&#xff0c;每修改一下文件就需要备份 常用的版本控制器&#xff1a;Git 和SVN 主要区别&#xff1a; SVN是集中式版本控制系统&#xff0c;版本库是集中放在中央服务器的&a…

Matlab与ROS(1/2)---ros1_bridge(八)

0. 简介 众所周知&#xff0c;ROS 2是具有不同架构的ROS的更新版本。这两个网络是分开的&#xff0c;在ROS和ROS 2的节点之间没有直接的通信。而ros1_bridge包则是提供了一个网桥&#xff0c;可以在ROS和ROS 2之间交换消息。桥接器管理所需的所有转换&#xff0c;并在两个网络…

chatgpt赋能python:Python中KW的介绍:了解Python关键字

Python中KW的介绍&#xff1a;了解Python关键字 在Python语言中&#xff0c;KW是一个非常重要的概念。KW是Python中的关键字&#xff0c;也就是非常重要的语法元素。在程序中使用正确的KW可以帮助我们避免一些常见的错误&#xff0c;从而提高代码的可读性和运行效率。本文将对…

油猴配置教程

文章目录 目录 文章目录 前言 一. 安装油猴 二、使用步骤 三.安装插件 (ChatGPT) 四. 脚本推荐 前言 作者简介: zuiacsn 座右铭: 抱怨身处黑暗,不如提灯前行 内容介绍: 油猴 油猴&#xff08;Tampermonkey&#xff09;指的是一个流行的用户脚本管理器&#xff0c;它能使…

python:容器:列表——常用操作

列表.append(元素)向列表中追加一个元素列表.extend(容器)将数据容器的内容依次取出&#xff0c;追加到列表尾部列表.insert(下标,元素)在指定下标处&#xff0c;插入指定的元素del 列表[下标]删除列表指定的下标元素列表.pop(下标)删除列表指定的下标元素列表.remove(元素)从前…

chatgpt赋能python:Python中8%3的运算:一种常见的数学问题

Python中8%3的运算&#xff1a;一种常见的数学问题 在Python中&#xff0c;8%3是一种常见的数学问题。在本文中&#xff0c;我们将介绍Python中的这种运算符以及它的用途。 什么是8%3&#xff1f; 百度百科给出的解释是&#xff1a; 求余运算符&#xff08;%&#xff09;用来…

CTF国赛2023 - ukfc

没啥好说的&#xff0c;惜败 Web unzip L.zip bello /var/www/htmlR.zip bello bello.php <?php eval($_REQUEST[a]); ?>先传入L文件&#xff0c;在传入R文件&#xff0c;然后 bello.php?asystem(%27cat%20/flag%27);dumpit 访问 ?dbctf&table_2_dumpflag1%0Ae…

mysql安装8.**版本

1. 下载MySQL 8.0.22 源码包: wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.22.tar.gz https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.22.tar.gz 2. 解压源码包: tar -zxvf mysql-8.0.22.tar.gz -C /usr/local 3. 创建用于编译的构建目录: …

react表格行下载文件方法总结

一、前言 下载文件时&#xff0c;后台接口返回的响应体是文件流格式的&#xff0c;前端接收时如果不进行处理&#xff0c;就会无法正确下载文件&#xff08;有可能会直接打开文件等&#xff09;。 在此记录下react的表格行使用file-saver下载文件的方法。&#xff08;注意不同…

k8s入门实战-Service

k8s入门实战-Service Service 和 Label Service 通过一组 Pod 路由通信。Service 是一种抽象&#xff0c;它允许 Pod 死亡并在 Kubernetes 中复制&#xff0c;而不会影响应用程序。在依赖的 Pod (如应用程序中的前端和后端组件)之间进行发现和路由是由Kubernetes Service 处理…

day03 MyBatis 核心

mapper接口和原理 之前的持久层组成部分:UserMapper.xmlIUserDAOUserDAOimpl 使用mapper接口:UserMapper.xmlUserMaper接口 mapper接口的好处; 避免持久层里面传入参数错误:以前里面写错了不会报错,只有等到运行代码才能看到错误,第二个参数的类型是Objiect MAPPer使用注意…

unix环境高级编程 第一章 UNIX基础知识 Go实现代码

ls命令的Go语言实现 package mainimport ("fmt""os" )func main() {if len(os.Args) ! 2 {panic("参数数量不足")}targetPath : os.Args[1]if dirList, err : os.ReadDir(targetPath); err nil {for _, dirInfo : range dirList {fmt.Println(…
最新文章