恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

【C++】 初阶篇 STL简介 -- string 的使用

  • 首页
  • 资讯中心
  • /
  • 【C++】 初阶篇 STL简介 -- string 的使用

相关资讯

成均馆大学/亚洲大学CEJ:焦耳加热双层超快反应器+高熵合金催化聚烯烃共聚废塑料定向解聚乙丙烯不凝气产率达 70% 2026/10/21 11:18:42
Bash 防御式编程实战指南:基于 agentic-awesome-skills 仓库的可靠 Shell 脚本模式 2026/10/21 11:18:42
Qwen3.8-27B-multi-turn-agent-sft实战教程:从零训练你的第一个终端Agent模型 2026/10/21 11:18:42

最新资讯

AI生成检测总不过?二次优化靠句式重构而非同义词替换
GROMACS gro转car实战:与Materials Studio结构互转详解
零基础用C++和Qt写2048小游戏:从控制台到图形界面实战
OpenSSL 3.2.0 x64 静态库:Windows 编译避坑与工程集成指南
算法工程师效率革命:从环境配置到GPU利用率的基础设施改造
本地大模型部署实战:从硬件选型到性能调优

今日推荐

SAP 屏幕上的金额未必存在数据库表里,从 WB2R_SV 的 Net Amount 看懂运行时计算
具身智能中‘指哪打哪’的视觉语言动作联合建模
AI时代人工翻译技术博客的价值与实践指南

本周热门

基于GMM的语音识别系统原理与MATLAB实现详解
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

【C++】 初阶篇 STL简介 -- string 的使用

发布时间:2026/10/21 11:18:42
【C++】 初阶篇 STL简介 -- string 的使用 前言string是 C 中处理字符串的核心工具比 C 语言的char*更安全高效这篇文章从string的基础概念出发聚焦构造、访问、容量、修改等核心接口搭配测试、案例如分割网址讲清用法与场景最后补充编译器差异帮你系统掌握string的高效使用。一、string类的使用1.1 什么是stringC 语言中字符串是以\0结尾的若干个字符的集合为了操作方便C 语言string.h头文件提供了一些系列的库函数但是这些库函数与字符串是分离开的不符合面向对象的思想而且底层空间需要用户自己管理稍不留神可能还会越界访问。基于上面这些原因C 标准库提供了string类string类中提供了各种函数接口比如类的六个默认成员函数、字符串插入删除、运算符重载等等我们可以使用string来实例化对象然后通过string的各种接口来完成对该对象的各种操作。string类的实现框架大概如下namespacestd{templateclassTclassstring{public:// string 的各种成员函数private:T*_str;size_t _size;size_t _capacity;//string 的其他成员变量比如npos};}我们打开 cplusplus.com 搜索string会发现string其实是basic_string类模板使用字符类型char实例化得到的一个类前面我们说了string是管理字符的指针那么string为什么要设计成模板呢因为编码不同存储一个字符所需要的空间也不同现如今常见的编码有如下三类ASCII 编码ASCII 全称为美国信息交换标准代码这是我们接触到的第一种编码由于英语所有的英文字母 (包括大小写) 加上各种标点符号以及特殊字符一共只有一百多种所以我们使用一个字节即可表示所有字符但是根据 ASCII 编码设计出的计算机不能表示其他国家的语言比如中文、日文、韩文等等。UnicodeUnicode 就是我们的统一码也叫万国码它是为了解决传统的字符编码方案的局限而产生的它为每种语言中的每个字符设定了统一并且唯一的二进制编码以满足跨语言、跨平台进行文本转换、处理的要求。Unicode 主要包括 utf-8utf-16 与 utf-32其中的 8、16 与 32 分别代表了字符的最小空间为 1、2 以及 4 字节。由于 utf-8 支持 ASCII且字符最小单位为一字节节省了空间所以现在使用率最高的编码方式就是它。GBKGBK 即 “国标”是我国专门为汉字设计的一套编码其中一个字符最小占用空间为两个字节。1.2 使用前的准备用string类时代码里必须加这两句#includestring// 包含头文件usingnamespacestd;// 引入std命名空间二、string构造函数函数原型功能说明示例string()无参默认构造创建空字符串string s;string(const string str)拷贝构造用已有string对象构造新对象string s1(s0);string(const string str, size_t pos, size_t len npos)子串构造从pos开始截取len个字符string s(s0, 2, 4);string(const char* s)C 风格字符串构造用char*初始化string s(hello);string(const char* s, size_t n)截取 C 串前n个字符string s(hello, 3);string(size_t n, char c)重复字符填充构造string s(5, A);string s1;string tmphello;string s2tmp;// 拷贝构造对象实例化时赋值strings3(tmp,2,2);// 从 tmp 的索引 2 开始取 2 个字符strings4(string);// C 风格字符串构造strings5(string,2);// 取前 2 个字符strings6(5,A);// 5 个 Acout无参默认构造s1 长度s1.size()endl;cout拷贝构造s2endl;cout子串构造s3endl;coutC 串构造s4endl;cout截取 C 串s5endl;cout重复字符s6endl;2.1 参数详解string(const char* s)用于通过 C 语言风格的字符串构造string对象string(const string str, size_t pos, size_t len npos)则是从已有string对象对应的字符串中截取从pos下标开始的len个字符来构造新的string对象。参数规则若pos超过字符串的最大下标会触发断言错误若原字符串str长度不足或len取值为string::npos则会从pos位置开始复制到字符串末尾。pos越界使用npos缺省值string对应字符串后面有没有\0string test1hello;stringtest2(test1,5);couttest2endl;运行后控制台无输出且未触发断言警告。这个现象可以说明string内部会在存储的字符串末尾维护\0但由于\0是不可打印字符所以输出时不会显示而我们从原字符串的末尾位置下标 5截取字符时刚好取到了这个\0因此控制台没有打印出可见内容。string::npos定义为-1在赋值给size_t类型时触发有符号int到无符号size_t的算术转换-1的补码全 1被解释为size_t的最大值。若平台是 32 位系统size_t是 32 位无符号整数此时npos的值为 2³² - 1若平台是 64 位系统size_t是 64 位无符号整数此时npos的值为 2⁶⁴ - 1。我之所以能直接用cout打印string对象是因为标准库中为string重载了配合cout和配合cin这两个输入输出运算符具体接口介绍后面讲。2.2 单参数构造的隐式类型转换// 单参数构造函数支持隐式类型转换// 张三是 const char* 类型会先调用 string(const char* s) 构造一个临时 string 对象// 再通过拷贝构造把这个临时对象的内容复制给 s。// 但实际编译时编译器会自动优化这个过程直接用 张三 构造 s只调用 1 次构造函数// 省去了临时对象和拷贝的开销。string s张三;如果想禁止这种隐式转换可以给单参数构造函数加explicit关键字比如explicit string(const char* s)这样就不能直接用string s 张三得显式写string s(张三)。三、string类对象的访问及遍历操作函数名称函数功能对应 const 版本begin()返回指向字符串第一个字符的迭代器cbegin()end()返回指向最后一个字符的下一个位置的迭代器cend()rbegin()反向迭代器返回指向最后一个字符的迭代器crbegin()rend()反向迭代器返回指向第一个字符的前一个位置的迭代器crend()补充operator[]非 const 版本char operator[](size_t pos)—— 可读写const 版本const char operator[](size_t pos) const—— 仅读3.1operator[]功能返回pos位置的字符这里先提前预告一下string里面有一个成员函数是size获取有效字符的个数那么我们就这样看这样写遍历了。3.2begin end功能begin获取第一个字符的迭代器 end获取最后一个字符下一个位置的迭代器迭代器是 C 容器如string、vector、map的 “通用访问工具”本质是封装了指针的对象作用是✅ 遍历容器中的元素读 / 写✅ 屏蔽不同容器的底层实现差异比如数组、链表遍历方式不同但迭代器用法统一。核心特点用法像指针支持*it取元素、it移动、it-取成员等操作分类适配场景比如begin()返回指向第一个元素的迭代器end()返回 “最后一个元素的下一个位置的迭代器”注意失效容器扩容 / 缩容 / 删除元素时迭代器可能失效指向无效内存需重新获取后面实现时讲解。大家可以把string这个容器中迭代器就是指针begin返回的是指向第一个字符的指针end返回的是指向最后一个字符下一个位置的指针这是因为string容器存储的是字符串可以直接通过指针对字符串进行解引用操作等当然并不是所有迭代器的底层都是用指针实现的遍历3.3rbegin rend功能和begin/end的区别是rbegin/rend是反向遍历rbegin指向的是最后一个数据的位置rend指向的是第一个元素3.4 const 迭代器这个和上述介绍的迭代器没本质区别不同的就是const迭代器指向的对象不能被修改四、string类对象的容量操作4.1 size功能返回字符串有效大小不包含末尾的\04.2 length功能返回字符串有效长度不包含末尾的\0注length和size的功能完全一致返回结果相同只是命名来源不同 ——length是早期为字符串设计的接口size是后续为了统一所有容器如vector的接口风格新增的二者在string中是等价的。4.3 capacity功能返回空间总大小string的自动扩容规则在插入数据且当前空间不足时string会自动扩容不同编译器的扩容策略不同VS 环境下第一次扩容为当前容量的 2 倍后续扩容为当前容量的 1.5 倍g 环境下每次扩容均为当前容量的 2 倍。4.4 empty功能检测字符串是否为空串是返回true否则返回false4.5 clear功能清空有效字符4.6 reserve重要功能提前给字符串分配好指定大小的内存空间不会改变size【场景1】reserve要求 100 个字节空间但却开辟了 111 个字节空间为啥呢这是 VS 编译器的内存对齐 / 容量对齐策略导致的因为string是一个类就会有内存对齐。reserve(100)只是要求 “至少 100 字节”VS 会在满足需求的基础上额外多分配一些空间比如按特定规则对齐所以实际开辟了 111 字节。【场景2】reserve请求空间小于当前容量时的容量变化缩容当reserve(n)中n小于当前字符串容量时标准将 “缩小容量” 定义为非约束请求 —— 编译器 / 容器实现可以自主决定是否缩容但通常会选择 “不缩容”比如本示例中当前容量 15请求的 10容量保持 15 不变最终保证容量不小于n即可。reserve在新版 VS 里的行为✅ 当 n 当前容量正常扩容满足容量≥n❌ 当 n 当前容量完全不缩容容量保持原样仅保证不低于 n但不会主动减小。4.7 resize重要功能将有效字符的个数改成n个多出的空间用 “字符 c” 或者\0填充【场景1】n size字符串会被扩展到n个字符新增的位置默认填充\0空字符如果显式传第二个参数比如resize(n, a)则用指定字符填充。【场景2】n size字符串会被截断只保留前n个字符超出部分直接丢弃不可逆。ps以上内容我是一个一个讲的并加入实例下面开始我会把他们做成一个表格来讲重要的我会把他单独拎出来讲五、string类对象的修改操作接口功能简述备注push_back(char c)在字符串尾部插入一个字符仅支持单字符append(const string str)在字符串尾部追加一个字符串支持string/ C 串operator(const string str)在字符串尾部追加字符串最常用支持单字符、C 串、string等重载c_str()返回const char*形式的 C 风格字符串末尾含\0方便与 C 接口交互find(const string str, size_t pos 0)从pos开始向后查找目标首次出现位置找不到返回string::nposrfind(const string str, size_t pos npos)从pos开始向前查找目标最后一次出现位置找不到返回string::npossubstr(size_t pos 0, size_t n npos)从pos开始截取n个字符并返回新string越界自动截断不抛异常string s1;s1.push_back(s);couts1endl;s1.append(tring:);couts1endl;s1 hello world;couts1endl;couts1.c_str()endl;couts1.find(hello)endl;couts1.find(ljm)endl;couts1.rfind(hello)endl;couts1.rfind(ljm)endl;string tmps1.substr(8,999);couttmpendl;5.1operator【功能】在字符串后追加字符串str5.2 c_str功能返回 C 格式的字符串验证string s1;s1 hello world;s1[5]\0;couts1endl;couts1.c_str()endl;5.3 find 和 rfind功能从字符串pos位置开始往后找字符c返回该字符在字符串中的位置功能从指定位置开始从后往前搜索目标内容在字符串中最后一次出现的位置5.4 substr功能在str中从pos位置开始截取n个字符然后将其返回5.5 insert功能任意位置插入内容注意对于非法插入操作程序一般会抛出异常来提示错误。不过我现在还没学到异常处理的相关内容所以这里就不写异常捕获的代码了之前用到的几个插入接口遇到非法插入时也会以抛异常的方式报错。5.6 erase功能删除字符串中任意位置的内容这个接口用起来确实挺灵活但得谨慎使用 —— 它底层的效率比较低会涉及大量的数据移动操作。5.7 问题findsubstr小案例分割网址前置知识//https://blog.csdn.net/HSWLJM?typeblogstring urlhttps://blog.csdn.net/HSWLJM?typeblog;size_t pos1url.find(:);cout协议url.substr(0,pos1)endl;size_t pos2url.find(/,pos13);cout域名url.substr(pos13,pos2-pos1-3)endl;cout资源名url.substr(pos21)endl;小案例所有空格替换成 %20//https://mp.csdn.%20%20%20%20%20%20%20net/string shttps://mp.csdn. net/;string ret;for(autoc:s){if(c! ){retc;}else{ret%20;}}coutretendl;六、string类非成员函数6.1operator功能拼接字符串不会修改原字符串尽量少用因为传值返回导致深拷贝效率低6.2operator和operatoroperator功能流提取运算符重载operator功能流插入运算符重载6.3 getline功能获取一行字符串和不同的是它仅仅以换行为结束标识如果想读取包含空格的整行字符串得用getline(cin, s)6.4 relational operators功能大小比较比的是 ASCII 编码

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号