【C++】——模板初阶 | STL简介

慈云数据 1年前 (2024-03-25) 技术支持 66 0

在这里插入图片描述

前言:

模板初阶 | STL简介


文章目录

  • 一、模板初阶
    • 1.1 函数模板
    • 1.2 类模板
    • 二、STL简介 (了解)

      一、模板初阶

      泛式编程(Generic Programming)指的是一种编程范式,其核心思想是编写可以在不同数据类型上通用的代码,从而提高代码的复用性、可维护性可扩展性

      泛式编程的实现方式包括模板(Template)和泛型(Generics)。在C++中,使用模板可以实现泛型编程,而在Java、C#等语言中,则使用泛型来实现类似的功能。


      1.1 函数模板

      函数模板的格式如下:

      template 
      返回类型 函数名(参数列表) {
          // 函数体
      }
      
      • template :以关键字 template 开始,后跟尖括号 ,里面是一个或多个模板参数的列表。例如typename T1 定义了一个类型模板参数 T1,可以替换为其他任意合法的标识符。

      • 返回类型:函数的返回类型,可以是任意类型。

      • 函数名:函数的名称,可以是任意合法的标识符。

      • 参数列表:函数的参数列表,可以包含零个或多个参数,每个参数可以是任意合法的标识符,也可以是模板参数。

      • 函数体:函数的具体实现,包括函数的操作和逻辑。

        一个具体的函数模板示例:

        // 函数模板的定义
        template 
        T maximum(T x, T y) {
            return (x > y) ? x : y;
        }
        // 调用模板函数
        int result1 = maximum(10, 20);
        double result2 = maximum(3.14, 2.71);
        

        在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。


        函数模板实例化

        函数模板的实例化是指根据具体的类型,生成模板函数的过程。当编译器在代码中遇到对函数模板的调用时,它会根据传递的参数类型推导出模板参数的具体类型,并生成相应的函数实例。

        // 定义函数模板
        template 
        T maximum(T x, T y) {
            return (x > y) ? x : y;
        }
        int main() {
            int result1 = maximum(10, 20); // 实例化为 maximum(10, 20),T 被推导为 int
            double result2 = maximum(3.14, 2.71); // 实例化为 maximum(3.14, 2.71),T 被推导为 double
        	 //或者我们可以手动进行实例化
        	 // 手动实例化模板函数为 int 类型
            int result3 = maximum(10, 20);
            
             // 手动实例化模板函数为 double 类型
            double result4 = maximum(3.14, 2.71);
            return 0;
        }
        

        函数模板的实例化是在编译时进行的,每次调用函数模板时,都会根据传递的参数类型生成相应的函数实例。这样,同一个函数模板可以用于多种不同类型的参数,实现了通用的函数。


        模板参数的匹配原则

        一个非模板函数和一个同名的函数模板可以同时存在,编译器会根据一定的匹配规则来确定使用哪一个函数。

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

        例如:

        // 非模板函数
        void foo(int x) {
            cout 
            cout 
            foo(42); // 调用非模板函数
            foo("hello"); // 调用函数模板
            return 0;
        }
        
        private:
            T elements[N];
            int top; // 栈顶索引
        public:
            Stack() : top(-1) {} // 初始化栈顶索引为-1
            void push(const T& element) {
                if (top == N - 1) {
                	// 栈满,抛异常
                    throw std::overflow_error("Stack
微信扫一扫加客服

微信扫一扫加客服