跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ 模板机制与 string 类实战指南

深入探讨 C++ 模板机制与 std::string 类的使用。首先解析函数模板与类模板的实例化原理及参数匹配规则,阐明泛型编程如何提升代码复用率。随后聚焦 STL 中的 string 类,系统梳理其构造、迭代器、容量管理、元素访问及修改接口。特别指出 insert、erase 等操作的时间复杂度风险,以及 shrink_to_fit 在不同编译器下的行为差异。内容涵盖 API 详解与底层逻辑,适合希望夯实 C++ 基础的开发者参考。

星云发布于 2026/3/29更新于 2026/6/817 浏览
C++ 模板机制与 string 类实战指南

C++ 模板机制与 string 类实战指南

泛型编程基础:函数与类模板

模板是 C++ 实现代码复用的核心手段。简单来说,它就像是一个模具,倒入不同的材料(类型),就能获得不同材质的铸件(实例)。

函数模板原理

如果我们要实现一个交换函数,直接写 swap(int a, int b) 只能处理整型。若需支持浮点或字符,通过重载虽然可行,但维护成本极高,且代码冗余。

函数模板解决了这个问题。template<typename T> 定义了一个模板,编译器会根据传入的实参类型自动推演生成特定版本的函数。

template <typename T>
void swap(T& a, T& b) {
    T temp = a;
    a = b;
    b = temp;
}

实例化方式:

  1. 隐式实例化:调用时让编译器根据实参推导类型。
  2. 显示实例化:在函数名后显式指定 <T>。

匹配原则:

  • 非模板函数与同名函数模板共存时,优先调用非模板函数。
  • 若模板能产生更好匹配的函数,则选择模板。
  • 模板函数不支持自动类型转换,普通函数可以。

类模板简介

类模板的定义格式类似,但实例化时需要在类名后跟 <T>,因为类模板本身不是真正的类,实例化后的结果才是。

template <class T1, class T2>
class MyClass {
    // 成员定义
};

MyClass<int, double> obj; // 实例化

模板结构示意

STL 框架概览

STL(Standard Template Library)是 C++ 标准库的重要组成部分,涵盖了数据结构、算法及容器。学习 STL 主要关注空间配置器、迭代器、容器、算法和适配器五大板块。

std::string 核心解析

std::string 本质上是 basic_string<char> 的 typedef,用于存储字符串。掌握其接口与底层逻辑至关重要。

构造与赋值

构造函数提供了多种初始化方式,包括默认构造、拷贝构造、从 C 风格字符串构造等。

// 常用构造方式
string s1;                          // 默认构造
string s2(s1);                      // 拷贝构造
string s3("hello");                 // C-string 构造
string s4(s3, 0, 3);                // 子串构造
string s5(5, 'a');                  // 填充构造

// 赋值操作
s1 = s2;                            // operator=

迭代器与容量管理

迭代器提供了类似指针的访问能力,分为正向、反向及 const 版本。

iterator begin();                   // 指向首元素
iterator end();                     // 指向尾后位置
reverse_iterator rbegin();          // 反向开始

容量相关函数主要用于内存管理:

  • size() / length():获取当前长度。
  • capacity():获取当前分配容量。
  • reserve(n):请求调整容量,不影响长度。
  • shrink_to_fit():建议缩容,但具体是否执行取决于编译器实现(如 VS 通常不立即释放,g++ 行为也视情况而定)。

容量变化示意

元素访问与修改

提供多种访问接口,注意 operator[] 不检查边界,而 at() 会抛出异常。

char& c = s[0];                     // 无边界检查
char& c = s.at(0);                  // 有边界检查
char& f = s.front();                // 首字符
char& b = s.back();                 // 尾字符

修改操作需谨慎,因为底层是数组,插入或删除涉及数据移动,时间复杂度为 O(N)。

s.push_back('x');                   // 末尾追加
s.pop_back();                       // 删除末尾
s.insert(pos, str);                 // 插入(O(N))
s.erase(pos, len);                  // 删除(O(N))
s.replace(pos, len, str);           // 替换

查找与子串操作

查找功能丰富,支持正向与反向搜索。

size_t pos = s.find("sub");         // 查找子串
size_t pos = s.rfind("sub");        // 反向查找
string sub = s.substr(0, 5);        // 提取子串
const char* cstr = s.c_str();       // 获取 C 风格字符串

注意 npos 是 size_t 类型的最大值,常用于表示未找到或结束位置。

npos 值示意

输入输出辅助

标准库提供了便捷的输入函数,可读取包含空格的整行内容。

getline(cin, str);                  // 读取整行
getline(cin, str, delim);           // 自定义分隔符

目录

  1. C++ 模板机制与 string 类实战指南
  2. 泛型编程基础:函数与类模板
  3. 函数模板原理
  4. 类模板简介
  5. STL 框架概览
  6. std::string 核心解析
  7. 构造与赋值
  8. 迭代器与容量管理
  9. 元素访问与修改
  10. 查找与子串操作
  11. 输入输出辅助
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 你在Obsidian里建的文件夹越多,你的笔记系统就越没用!
  • Win11 本地部署 OpenClaw 利用 WSL 集成飞书机器人功能
  • 微服务架构下 Spring Session 与 Redis 分布式会话实战
  • Llama Factory 大模型微调显存优化技巧
  • VSCode 集成 OpenAI 兼容模型配置指南
  • Linux 基础、进阶及常用命令总结
  • Windows 系统下 Python 新一代包管理工具 uv 及 VSCode 配置
  • 无人机远程路径规划:A*算法与GPS精准定位
  • MySQL 数据类型详解
  • 云开发 Copilot:AI 驱动的低代码开发实践
  • C++ 类与对象基础详解(上)
  • 如何在项目中启用 MISRA C++ 检查
  • MySQL 复合查询核心指南:多表、子查询与实战技巧
  • 基于 Web Unlocker 和 n8n 的自动化资讯采集与推送系统
  • Python 入门教程:从零开始到精通详解
  • NAO 机器人运动控制与指令操作指南
  • Linux 复习指南:Shell 脚本中最常见指令总结
  • 本地大模型与知识库工具部署及选型对比
  • OpenWebUI 联网搜索实战:用 SearXNG 让本地大模型获取实时信息
  • C++ 并发:内存序、可见性与指令重排

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online