一、上期回顾

掌握 STL 算法库:sortreversefindunique、最值、for_each,从此不用手写大量循环逻辑。今天深挖 C++ 模板,搞懂为什么 vector、map 能存任意数据类型。


二、模板核心作用

模板 = 代码复用 + 类型通用不用为 int、double、string 写多套相似函数 / 类,一套模板,适配所有类型,这就是泛型编程


三、函数模板

1. 语法格式

template<typename T>
函数返回值 函数名(形参)
{
    // 逻辑使用 T 当做通用类型
}

typename 也可以换成 class,效果完全一样。

2. 最简示例:通用交换函数

#include <iostream>
using namespace std;

// 函数模板
template<typename T>
void swapVal(T& a, T& b)
{
    T temp = a;
    a = b;
    b = temp;
}

int main()
{
    int a = 10, b = 20;
    double x = 1.1, y = 2.2;

    swapVal(a, b);
    swapVal(x, y);

    cout << a << " " << b << endl;
    cout << x << " " << y << endl;
    return 0;
}

自动类型推导:传什么类型,T 就是什么类型。

3. 模板函数重载

支持多个模板参数:

template<typename T1, typename T2>
void show(T1 a, T2 b)
{
    cout << a << " " << b << endl;
}

四、类模板

1. 作用

实现通用类,像 vector<T>map<K,V> 底层都是类模板。

2. 语法格式

template<typename T>
class 类名
{
private:
    T 成员变量;
public:
    成员函数用 T
};

3. 示例:通用栈类模板

template<typename T>
class MyStack
{
private:
    T arr[100];
    int top;
public:
    MyStack() : top(-1) {}

    void push(T val)
    {
        arr[++top] = val;
    }

    T pop()
    {
        return arr[top--];
    }
};

4. 类模板使用

int main()
{
    MyStack<int> st1;
    st1.push(10);

    MyStack<double> st2;
    st2.push(3.14);
    return 0;
}

类模板必须显式指定类型,不能自动推导。


五、模板具体化(特例化)

特定类型单独定制逻辑,优先级高于通用模板:

// 通用模板
template<typename T>
void print(T a)
{
    cout << "通用版本:" << a << endl;
}

// string 类型特例化
template<>
void print<string>(string a)
{
    cout << "字符串特化:" << a << endl;
}

六、模板原理通俗理解

  1. 模板不编译成实际代码,只是一张图纸
  2. 用到什么类型,编译器自动实例化一份对应代码
  3. 优点:代码简洁、复用极强
  4. 缺点:代码膨胀、编译时间变长

七、模板与普通函数区别

  1. 普通函数:固定类型,复用性差
  2. 模板函数:一套代码适配所有类型
  3. 模板可以自动类型推导,类模板必须指定 <T>

八、今日核心总结

  1. 模板分为:函数模板、类模板
  2. template<typename T> 定义通用类型
  3. 函数模板可自动推导类型;类模板必须显式指定类型
  4. 模板特例化可以给特定类型单独实现
  5. STL 所有容器、算法底层全靠模板泛型支撑

九、课后练习

  1. 写函数模板,实现求两个数最大值
  2. 手写类模板 MyArray,支持存 int、double
  3. 体会模板不用重复写多套类型代码

更多推荐