当前位置: 首页 > news >正文

【C++初阶】C++ 模板与 string 类详解

模板

当我们写交换两个元素的函数时,通常会这样写:

代码语言:javascript

AI代码解释

void swap(int& x, int& y) { int tmp = x; x = y; y = tmp; }

但是,如果要交换long long类型、double类型,甚至自定义类型,就需要写多个函数了。

为了解决这个问题,C++ 引入了模板这个概念。

1. 函数模板

代码语言:javascript

AI代码解释

template<class T> void swap(T& a1, T& a2) { T tmp = a1; a1 = a2; a2 = tmp; }

注意点:

  1. class可以改成typename,现阶段两者没有区别
  2. 实质:编译器自动推断,生成对应函数(类比类的实例化,称为模板的实例化)
  3. 同一个T不能代表不同类型

代码语言:javascript

AI代码解释

int a = 1; double b = 2.0; swap(a, b); // 报错:"swap": 未找到匹配的重载函数
处理不同类型的参数
方法1:强制类型转换

代码语言:javascript

AI代码解释

template<class T> T add(const T& a, const T& b) { return a + b; } cout << add(a, (int)b) << endl;

这种方法有很多局限性。

方法2:显式实例化

代码语言:javascript

AI代码解释

add<int>(a, b); // 在前面加上类型
方法3:定义两个模板参数

代码语言:javascript

AI代码解释

template<class T1, class T2> T1 add(const T1& a, const T2& b) { return a + b; }
模板参数作为返回值

有些时候,编译器无从推断T的类型:

代码语言:javascript

AI代码解释

template<class T> T* func(int n) { return new T[n]; }

这个时候就必须显式实例化:

代码语言:javascript

AI代码解释

int* a = func<int>(5);
模板与普通函数的优先级

代码语言:javascript

AI代码解释

template<class T1, class T2> T1 add(const T1& a, const T2& b) { return a + b; } int add(const int a, const int b) { return a + b; }

根据调试结果,优先调用对应的普通函数。

2. 类模板

为方便理解,先写一个简单的栈类:

代码语言:javascript

AI代码解释

template<class T> class stack { public: stack(int n = 4) : capacity(n) , size(0) , _arr(new T[n]) { } ~stack() { delete[] _arr; _arr = nullptr; capacity = 0; size = 0; } void push(const T& s) { if (capacity == size) { T* tmp = new T[2 * capacity]; memcpy(tmp, _arr, sizeof(T) * size); delete[] _arr; capacity *= 2; _arr = tmp; } _arr[size++] = s; } private: size_t capacity; size_t size; T* _arr; };

注意:类模板必须显式实例化

代码语言:javascript

AI代码解释

stack<int> st1; stack<double> st2;

这样,就可以让栈中存储不同类型的元素了。

声明与定义分离

代码语言:javascript

AI代码解释

// 声明 template<class T> class stack { public: // ... void push(const T& s); // ... }; // 定义 template<class T> void stack<T>::push(const T& s) { if (capacity == size) { T* tmp = new T[2 * capacity]; memcpy(tmp, _arr, sizeof(T) * size); delete[] _arr; capacity *= 2; _arr = tmp; } _arr[size++] = s; }

甚至可以使用不同的模板参数名:

代码语言:javascript

AI代码解释

template<class X> void stack<X>::push(const X& s) { // ... }

这也可以证明模板实质上是编译器自动生成特定元素类型的类。

有了模板,C++ 就可以写一份代码,无伤兼容各种类型,这就诞生了STL:让顺序表、栈、队列等数据结构由编译器帮你生成。

C++ string 类详解

简介

在认识 string 之前,先介绍两个有用的网站:

  1. C++ 官方文档
    • 优点:更新及时
    • 缺点:较杂乱

在接下来的内容中,我们将使用非官方文档进行讲解。

1. 使用方法

注意:这里的一些代码不需要彻底理解,我们在模拟实现部分会详细讲解。

http://www.jsqmd.com/news/761624/

相关文章:

  • SPI屏驱动进阶:硬件SPI vs 软件模拟,谁才是1.44寸TFT的最佳拍档?
  • 别再只玩单片机了!用阿里云物联网平台快速给你的ESP32项目加上‘云大脑’
  • 如何实现番茄小说永久离线阅读?这个免费工具给你完整解决方案
  • 告别乱码和鬼影!手把手教你用STC89C52驱动LCD1602(附完整代码和电位器调试技巧)
  • BetterRenderDragon:5个步骤解锁Minecraft极致画质与性能
  • ARM Cortex-A系列缓存架构与优化实践
  • 告别玄学:用示波器抓取AMD平台TPS51125电源芯片的PGOOD信号,实战时序测量指南
  • 热键侦探:Windows热键冲突终极诊断工具揭秘
  • 3个技巧让GPX轨迹编辑效率翻倍:GPX Studio深度体验指南
  • 威联通NAS用户看过来:手把手教你为Jellyfin Docker容器升级FFmpeg,解锁Intel QSV硬解全流程
  • 2026成都封闭式雅思培训标杆名录:成都小托福培训/成都托福培训学校/成都托福培训机构/成都托福培训费用/成都托福基础培训班/选择指南 - 优质品牌商家
  • 如何在Windows上实现macOS风格的三指拖拽功能?终极指南
  • 不只是换源:深入理解 Ubuntu APT 源的数字签名与安全机制
  • 2026年4月行业内可靠的MPP电力管厂商口碑推荐,PE穿线管/PVC排水管/PE克拉管,MPP电力管公司哪个好 - 品牌推荐师
  • 新手必看!LLM大模型核心参数全解析,4套场景标配参数直接用,从0到1轻松入门!
  • React代理与样式注入实现Dify聊天机器人无缝嵌入Web应用
  • 告别软件触发!深入STM32G4 TIM1与ADC的硬件级联动:从原理图到代码实现
  • 别再死记硬背了!用GESP密码检测题,彻底搞懂C++字符串处理的那些坑
  • GD32F470 ADC+DMA实战:用梁山派开发板实现高精度电流采样(附VOFA+波形分析)
  • 2026靖江网站建设全指南:泰州做网站、泰州网站建设、泰州网络公司、靖江AI优化、靖江geo优化、靖江做网站、靖江网站优化选择指南 - 优质品牌商家
  • FreeRTOS下串口打印的坑我帮你踩了:STM32CubeMX配置避坑与性能优化指南
  • SkillCompass:AI技能质量评估与持续改进的工程化实践
  • STM32F103C8T6驱动VL53L0X激光测距模块,从硬件连接到代码调试的保姆级教程
  • 别再只调参了!用PyTorch实战VGG16/VGG19,我发现了苹果病虫害分类的这几个关键点
  • Assembly汇编底层编程实战案例教程
  • 新手零基础入门:通过快马ai指导完成ubuntu系统安装全流程详解
  • 南充吊车租赁技术选型指南及合规服务商盘点:四川鼎全机械租赁有限公司联系电话/南充吊车租赁电话/南充随车吊租赁/南充垫路钢板租赁/选择指南 - 优质品牌商家
  • STM32CubeMX实战:独立看门狗(IWDG)与窗口看门狗(WWDG)到底怎么选?附F407避坑配置
  • 自建本地基金数据看板:基于Docker与Node.js的数据聚合与可视化实践
  • ForeSight:统一接口与回测优先的时间序列预测工具箱实践指南