波奇学C++:模板和STL

这篇具有很好参考价值的文章主要介绍了波奇学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六大组件

波奇学C++:模板和STL

 以String为例,什么是String?

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

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

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

波奇学C++:模板和STL

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

波奇学C++:模板和STL 

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

s2 += s3;//"xxxxxxxxxxabcdef"

学习STL的关键是学习文档的用法,利用学习的类和重载符的知识来更好地理解STL。 文章来源地址https://www.toymoban.com/news/detail-463268.html

到了这里,关于波奇学C++:模板和STL的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 什么是Web3.0?为什么我们需要 Web 3.0

    为了更好地理解什么是 Web 3.0,我们需要知道什么是 Web 1.0 和 2.0。 为了不让你厌烦,这里简单的解释一下: WEB 3.0 例子:xiaqo.com Web 1.0  —— 信息仅从网站传递给用户。 Web 2.0  —— 信息是双向的。 用户可以与网站交互互动。 Web 3.0  —— 伟大的超越。 信息变得开放、分散

    2024年02月03日
    浏览(51)
  • 【云原生-白皮书】简章1:为什么我们需要云原生架构?

    声明:本文为《阿里云云原生架构核心技术白皮书》的一些读书笔记与感想。 一文大致了解云原生架构模式特点传送门:五分钟了解云原生的架构模式 声明:本文是阅读阿里云云原生架构核心技术白皮书的一些读书笔记与感想。 云原生架构是一种创新的软件开发方法,专为

    2023年04月26日
    浏览(47)
  • 什么是分布式操作系统?我们为什么需要分布式操作系统?

    分布式操作系统是一种特殊的操作系统,本质上属于多机操作系统,是传统单机操作系统的发展和延伸。它是将一个计算机系统划分为多个独立的计算单元(或者也可称为节点),这些节点被部署到每台计算机上,然后被网络连接起来,并保持着持续的通信状态。在分布式操作

    2024年02月16日
    浏览(41)
  • 波奇学C++:模板和STL

    先假设一个场景,我们要编写一个函数交换a,b两个数的值 swap函数可以帮我们交换两个int型的值,那如果要交换的类型是float,double类型呢? 当然我们可以选择函数重载,使它支持多个数据类型。 可是这就意味着我们就要编写大量重复的代码。 有没有一种方法可以优化这个过

    2024年02月06日
    浏览(18)
  • 为什么kafka 需要 subscribe 的 group.id?我们是否需要使用 commitSync 手动提交偏移量?

    消费概念: Kafka 使用消费者组的概念来实现主题的并行消费 - 每条消息都将在每个消费者组中传递一次,无论该组中实际有多少个消费者。所以 group 参数是强制性的,如果没有组,Kafka 将不知道如何对待订阅同一主题的其他消费者。 偏移量 : 每当我们启动一个消费者时,

    2024年02月12日
    浏览(44)
  • 【Golang】三分钟让你快速了解Go语言&为什么我们需要Go语言?

    博主简介: 努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:数据结构、Go,Java等相关知识。 博主主页: @是瑶瑶子啦 所属专栏: Go语言核心编程 近期目标: 写好专栏的每一篇文章 Go 语言从 2009 年 9 月 21 日开始作为谷歌公司 20% 兼职项目,即相关

    2023年04月21日
    浏览(48)
  • Linux drm内存管理(一) 浅谈TTM与GEM,为什么我们需要TTM和GEM?

    @[TOC](Linux drm内存管理(一) 为什么我们需要TTM和GEM?) 系列文章(更新中): Linux drm内存管理(二) TTM内存管理基础概念   目前Kernel中DRM中GPU的VRAM(GPU片上显存)的管理框架是有GEM和TTM,其中TTM早于GEM出现,GEM的出现是为了解决TTM复杂的使用方法,将大部分的VRAM管理实现逻辑交由

    2023年04月20日
    浏览(37)
  • 有了NULL,为什么C++还需要nullptr?

    目录 1.引言 2.类型安全 3.函数重载 4.代码清晰性 5.示例 6.总结 在C++编程中,nullptr是一个类型安全的空指针常量,自C++11起被引入。然而,在此之前,程序员们通常使用NULL或0来表示空指针。那么,为什么有了NULL之后,C++还需要引入nullptr呢?本文将从类型安全、函数重载和代

    2024年02月21日
    浏览(40)
  • C++这么难,为什么我们还要用C++?C++ Core Guidelines解析给了我答案

    C++ 是一门强大而复杂的编程语言,它有其独特的应用场景和优势,尽管它可能在学习和使用上有一些挑战,但仍然被广泛采用的原因有很多,尽管 C++ 有其优势,但它也确实有一些复杂性和潜在的陷阱,因此在选择使用它时需要权衡。对于一些应用场景,其他编程语言,如Py

    2024年02月09日
    浏览(36)
  • 【C++学习】类和对象 | 拷贝构造 | 探索拷贝构造函数为什么需要引用传参 | 深拷贝 | 初识运算符重载

    上一篇文章我们开始学习类内的默认成员函数, 这里是传送门,有兴趣可以去看看:http://t.csdn.cn/iXdpH 这篇文章我们继续来学习类和对象的知识。 目录 写在前面: 1. 拷贝构造 2. 拷贝构造函数为什么需要引用传参? 3. 深拷贝 4. 初识运算符重载 写在最后: 我们在创建一个对

    2024年02月11日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包