小学生学C++编程语法知识(C++模板(Template)详解)

📅 2026/8/1 2:25:28
小学生学C++编程语法知识(C++模板(Template)详解)
C模板Template详解——给小学生的“魔法公式”同学们今天我们学习一个在C编程、STL标准库、算法竞赛中非常重要的知识模板Template。你平时写代码会经常看到vectorint a; sort(a.begin(),a.end());或者pairint,int p;甚至priority_queueint q;这里面的int其实就是模板参数。那么为什么一个vector既可以装int又可以装string为什么sort既可以排序整数又可以排序字符串C到底是怎么做到的这就是今天要解决的问题。一、为什么需要模板1. 一个现实问题假设我们要写一个交换两个数字的函数。比如交换两个整数void swap(int a,int b) { int ta; ab; bt; }使用int x10; int y20; swap(x,y);很好。但是后来我们想交换double类型double a1.2; double b3.5;怎么办重新写void swap(double a,double b) { double ta; ab; bt; }发现代码完全一样区别只有int换成double后来还有string char long long是不是每一种都写一个太麻烦了。二、模板的思想写一个万能版本程序员想能不能先不告诉计算机是什么类型比如以后你告诉我交换什么我自动生成对应代码。于是出现函数模板写法templatetypename T void mySwap(T a,T b) { T tempa; ab; btemp; }这里T就是一个占位符。你可以理解成一个空盒子。现在T还不知道是什么。调用情况1交换intint a10; int b20; mySwap(a,b);编译器发现a,b是int。于是把模板变成void mySwap(int a,int b) { int tempa; ab; btemp; }情况2交换doubledouble x1.1; double y2.2; mySwap(x,y);编译器生成void mySwap(double a,double b) { double tempa; ab; btemp; }所以一个模板templatetypename T可以生成很多函数。三、模板底层到底如何实现这是重点。很多初学者认为模板是不是运行的时候判断类型不是C模板不是运行时技术而是编译时期生成代码也叫模板实例化Template Instantiation例如我们写templatetypename T T add(T a,T b) { return ab; }调用coutadd(3,5); coutadd(1.5,2.5);编译器看到以后偷偷生成两个函数第一个int add(int a,int b) { return ab; }第二个double add(double a,double b) { return ab; }最后真正运行的时候程序里面根本没有模板只有add(int)和add(double)可以画成模板代码 templateT | | ↓ 编译器加工 | ---------------------- | | int版本 double版本 | ↓ 最终机器代码四、为什么模板运行速度快因为模板是在编译阶段展开。运行时没有判断类型 if(int) else(double)所以速度和普通函数一样。例如vector实际上编译器生成整数数组管理代码vector生成double数组管理代码没有额外损耗。五、类模板除了函数可以模板化。类也可以。例如我们想写一个盒子。普通类class Box { public: int value; };只能装int如果想装double string怎么办使用类模板templatetypename T class Box { public: T value; };现在Boxint a; Boxdouble b; Boxstring c;三个盒子分别变成Boxint Boxdouble Boxstring六、STL为什么全部使用模板这是竞赛中重要的地方。1. vector你写vectorint a;实际上vector是模板templatetypename T class vector { T *data; };所以vectorint变成整数数组管理器如果vectorstring变成字符串数组管理器七、sort为什么可以排序各种类型你有没有想过sort(a,an);为什么int可以5 2 9 1string也可以apple banana cat因为sort也是模板。类似templateclass Iterator void sort(Iterator begin,Iterator end) { }编译器根据你的数据自动生成整数排序版本。字符串排序版本。八、typename 和 class 有什么区别经常看到templatetypename T也看到templateclass T其实这里没有区别。例如templateclass T void fun(T x) { }等价templatetypename T void fun(T x) { }只是现代C更推荐typename因为更能表达这里是一个类型九、模板和普通函数有什么区别比较一下普通函数int max(int a,int b) { return ab?a:b; }只能int模板templatetypename T T myMax(T a,T b) { return ab?a:b; }可以myMax(3,5); myMax(2.5,8.1); myMax(a,z);十、模板的缺点模板很强但是也有问题。1. 编译时间变长因为一个模板可能生成很多代码。例如vectorint vectordouble vectorstring vectorlong long编译器都要生成。2. 错误信息很复杂例如模板错误可能出现几十行报错。初学者看到std::__cxx11...很害怕。其实通常只是类型不匹配。十一、信奥竞赛中什么时候需要模板小学阶段理解⭐⭐⭐⭐使用⭐⭐中学竞赛大量使用。例如STLvector queue stack set map priority_queue sort全部依赖模板。十二、给同学们的总结模板是什么一句话模板就是“代码的万能设计图”。比如普通代码一个盒子 只能装苹果模板一个魔法盒子 你放苹果 它变苹果盒 你放香蕉 它变香蕉盒模板底层原理记住一句C模板不是运行时变化而是在编译时复制生成不同版本代码。过程模板 ↓ 编译器看到使用方式 ↓ 自动生成对应代码 ↓ 编译成机器语言 ↓ 运行以后学习vector set map priority_queue sort不要认为这是C给我的工具而要知道它们背后都是高级程序员利用模板技术把通用算法提前设计好然后让编译器自动生成适合你的版本。这也是C相比很多语言强大的核心原因之一。你学习模板本质是在学习如何写出“一个代码适应无限场景”的能力。