C++模板编程:从零打造万能STL容器
·
一、上期回顾
掌握 STL 算法库:sort、reverse、find、unique、最值、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;
}
六、模板原理通俗理解
- 模板不编译成实际代码,只是一张图纸
- 用到什么类型,编译器自动实例化一份对应代码
- 优点:代码简洁、复用极强
- 缺点:代码膨胀、编译时间变长
七、模板与普通函数区别
- 普通函数:固定类型,复用性差
- 模板函数:一套代码适配所有类型
- 模板可以自动类型推导,类模板必须指定
<T>
八、今日核心总结
- 模板分为:函数模板、类模板
template<typename T>定义通用类型- 函数模板可自动推导类型;类模板必须显式指定类型
- 模板特例化可以给特定类型单独实现
- STL 所有容器、算法底层全靠模板泛型支撑
九、课后练习
- 写函数模板,实现求两个数最大值
- 手写类模板
MyArray,支持存 int、double - 体会模板不用重复写多套类型代码
更多推荐
所有评论(0)