• 【C++】模板基础 + STL


    模板

    一、泛型编程

    我们如果想用C++写Swap函数,既要交换整形也要交换浮点型,那么我们得用上函数重载:

    void Swap(int& x, int& y)
    {
    	int temp = x;
    	x = y;
    	y = temp;
    }
    
    void Swap(double& x, double& y)
    {
    	double temp = x;
    	x = y;
    	y = temp;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    可以发现两个相类似的函数我们要写多遍,很麻烦。如果使用模板就可以减小很多工作量,而模板又分为函数模板和类模板


    二、函数模板

    //函数模板
    template <class T>//template 
    void Swap(T& x, T& y)
    {
    	T temp = x;
    	x = y;
    	y = temp;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    T是参数类型,可以变换。

    但是整形和浮点型调用的不是一个函数,当int型调用函数时会把T变成int,当char型调用函数时会把T变成char。
    他们都会实例化出对应的函数,叫做模板实例化

    那如果我们要一个int型和double相加呢?

    template <class T>
    T Add(T& a, T& b)
    {
    	T sum = a + b;
    	return sum;
    }
    
    int main()
    {
    	int a = 1;
    	double b = 1.1;
    	cout << Add(a, b) << endl;
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    同一个T不可能同时实例化成两种类型。
    那么有三种解决方式(强制类型转化和显示实例化和两个模板参数):

    template <class T>
    T Add(const T& a, const T& b)
    {
    	T sum = a + b;
    	return sum;
    }
    
    int main()
    {
    	int a = 1;
    	double b = 1.1;
    	//cout << Add(a, b) << endl;
    	cout << Add((double)a, b) << endl;
    	cout << Add<double>(a, b) << endl;//显示实例化
    	cout << Add<int>(a, b) << endl;//显示实例化
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    这里要注意的是(double)a传过去的是const型的临时变量,需要用const变量接收。
    也可以用两个模板参数:

    T1 Add(const T1& a, const T2& b)
    {
    	T1 sum = a + b;
    	return sum;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    当函数模板和普通函数同时存在时:

    template <class T1, class T2>
    T1 Add(const T1& a, const T2& b)
    {
    	T1 sum = a + b;
    	return sum;
    }
    
    int Add(int& a, int& b)
    {
    	return a + b;
    }
    
    double Add(double& a, double& b)
    {
    	return a + b;
    }
    
    int main()
    {
    	int a = 1, b = 2;
    	double c = 1.1, d = 2.2;
    	cout << Add(a, b) << endl;// 1
    	cout << Add(c, d) << endl;// 2
    	cout << Add(a, c) << endl;// 3
    	return 0;;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    当两个都相同类型的时候调用普通函数,不同时调用函数模板。
    能调用普通函数优先调用普通函数。


    三、类模板

    在我们要实现栈的时候

    typedef int STDataType;
    //typedef char STDataType;
    
    class Stack
    {
    public:
    
    private:
    	STDataType* _a;
    	int _top;
    	int _size;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    因为不能使用泛型,如果要同时使用不同类型的栈就不行。
    所以我们要用泛型编程。

    template <class T>
    class Stack
    {
    public:
    
    private:
    	T* _a;
    	int _top;
    	int _size;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    有一点要注意
    当声明和定义分离时编译器会无法识别T
    所以要指定类域

    template <class T>
    class Stack
    {
    public:
    	void Push(T& x);
    private:
    	T* _a;
    	int _top;
    	int _size;
    };
    
    template <class T>
    void Stack<T>::Push(T& x)
    {}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    Stack是类模板的完整类型,Stack是类名。


    STL

    一、什么是STL

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

    我们前面的文章例如栈和队列、堆等等数据结构,都可以直接调用STL。


    二、STL的六大组件

    在这里插入图片描述


    三、STL的重要性及如何学STL

    3.1 STL的重要性

    在我之前的文章可以看到用C语言刷题的时候一遇到需要使用栈和队列的题目,都需要自己实现一遍,但是学完STL后就可以直接调用STL中的数据结构。

    3.2 学习STL的方法

    1. 需要具备一定的基础

    (1).C++语言基础(模板、类、运算符重载等)
    (2).基本的数据结构基础(数组、链表、树、图等)

    2. 需要对STL的各个容器的内存模型有所了解

    (1).了解容器的内存模型有利于加深对各个容器的成员函数的理解,有利于对各个容器成员函数的记忆与使用。
    (2).只有理解STL各个容器的内存模型才能在不同的场景下决定决定使用哪个容器效率高,使用哪个容器方便。

    3. 对STL的各个容器进行测试,根据测试结果加深对STL的使用

    (1).STL容器的构造函数,成员函数很多,并且有很多成员函数都有几个重载函数,如果不一一测试,进行对比分析,你很可能都不知道如何利用构造函数对容器进行初始化、成员函数怎么调用、常见的成员函数的参数都不知道怎么填。
    (2).STL的容器的成员函数很多都类似,当深入了解一种以后再学习其他的容器就会发现成员函数的使用和容器的操作都类似,STL越学越简单。

    学习STL推荐网站:
    https://cplusplus.com/



    纸上得来终觉浅,绝知此事要躬行。

  • 相关阅读:
    通过S3协议实现通用的文件存储服务中间件
    MAC地址表泛洪攻击
    C# —— while循环语句
    C Primer Plus(6) 中文版 第4章 字符串和格式化输入/输出 4.4 printf()和scanf()
    算法之路(一)
    第十三章 配置 Apache 以与 Web 网关配合使用 (Windows) - 推荐选项:Apache API 模块 (CSPa24.dll)
    【异常】理解Java中的异常处理机制
    中国5G产业全景图谱报告2022_挚物AIoT产业研究院
    Linux常⽤服务器构建-ssh和scp
    猿创征文|Highgo Database安全版安装指导手册
  • 原文地址:https://blog.csdn.net/qq_66314292/article/details/126688211