小学生学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相比很多语言强大的核心原因之一。你学习模板本质是在学习如何写出“一个代码适应无限场景”的能力。

相关新闻

LangGraph框架解析:AI应用开发的智能编排利器

LangGraph框架解析:AI应用开发的智能编排利器

1. LangGraph:下一代AI应用开发框架解析第一次接触LangGraph是在开发一个需要复杂决策流程的客服机器人项目时。当时使用传统方法需要写大量if-else逻辑来处理用户对话中的分支和循环,代码很快变得难以维护。直到发现LangGraph这个专门为AI应用设计的流程…

2026/10/19 1:13:46 阅读更多 →
通达信缠论插件终极指南:3步实现K线智能分析自动化

通达信缠论插件终极指南:3步实现K线智能分析自动化

通达信缠论插件终极指南:3步实现K线智能分析自动化 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 你是否曾经为手动分析缠论笔段而头痛?是否在复杂的K线图中迷失方向?…

2026/10/16 15:18:21 阅读更多 →
LMU伊莫拉赛道RCF调校与驾驶技巧:1分44秒999圈速突破指南

LMU伊莫拉赛道RCF调校与驾驶技巧:1分44秒999圈速突破指南

如果你是一位赛车模拟爱好者,或者正在寻找提升赛道圈速的方法,那么最近在赛车模拟圈内热议的“LMU 伊莫拉 RCF 1:44.999”这个成绩,可能已经引起了你的注意。这个看似简单的圈速记录背后,实际上涉及到了车辆调校、赛道走线、油门刹…

2026/10/18 18:10:24 阅读更多 →

最新新闻

Upscayl 本地 AI 图像放大:装完点 3 下按钮搞定一张 4 倍放大图

Upscayl 本地 AI 图像放大:装完点 3 下按钮搞定一张 4 倍放大图

Upscayl 本地 AI 图像放大:装完点 3 下按钮搞定一张 4 倍放大图 【免费下载链接】upscayl 🆙 Upscayl - #1 Free and Open Source AI Image Upscaler for Linux, MacOS and Windows. 项目地址: https://gitcode.com/GitHub_Trending/up/upscayl U…

2026/10/19 1:13:15 阅读更多 →
WeKnora 本地部署指南:30 分钟跑起你自己的 RAG 知识库

WeKnora 本地部署指南:30 分钟跑起你自己的 RAG 知识库

WeKnora 本地部署指南:30 分钟跑起你自己的 RAG 知识库 【免费下载链接】WeKnora Open-source LLM knowledge platform: turn raw documents into a queryable RAG, an autonomous reasoning agent, and a self-maintaining Wiki. 项目地址: https://gitcode.com/…

2026/10/19 1:13:15 阅读更多 →
电大计算机专业毕业论文全流程指南:选题、查重、格式与答辩

电大计算机专业毕业论文全流程指南:选题、查重、格式与答辩

简介:面向电大计算机科学与技术专业学生的毕业论文,主题为图书信息管理系统的设计与实现。论文完整覆盖管理信息系统建设的关键环节,从需求分析、功能模块划分,到数据库结构设计和前端应用程序开发均有详细介绍。系统采用易语言开…

2026/10/19 1:13:15 阅读更多 →
粒子群算法优化极限学习机:从随机初始化到参数寻优

粒子群算法优化极限学习机:从随机初始化到参数寻优

简介:面向Matlab数据分类任务,压缩包提供基于粒子群优化的极限学习机(PSO-ELM)完整实现,借助PSO对ELM输入权值与隐含层阈值进行寻优,适合需要提升分类精度、开展算法对比或复现论文实验的科研人员、研究生与…

2026/10/19 1:13:15 阅读更多 →
ComfyUI LTXVideo 入门指南:3 条路径生成 AI 视频

ComfyUI LTXVideo 入门指南:3 条路径生成 AI 视频

ComfyUI LTXVideo 入门指南:3 条路径生成 AI 视频 【免费下载链接】ComfyUI-LTXVideo LTX-Video Support for ComfyUI 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-LTXVideo ComfyUI LTXVideo 把 LTX-2 视频生成模型接入 ComfyUI,…

2026/10/19 1:13:15 阅读更多 →
STM32单片机 2引脚按键

STM32单片机 2引脚按键

按键:常见的输入设备,按下导通,松手断开按键抖动:由于按键内部使用的是机械式弹簧片来进行通断的,所以在按下和松手的瞬间会伴随有一连串的抖动为防止按键按一下,单片机却反应多次的现象,因此要…

2026/10/19 1:12:12 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →