C++ string类:高效处理字符串的必备技巧(下)

发布时间:2026/7/14 4:36:52

C++ string类:高效处理字符串的必备技巧(下)
文章目录C string类高效处理字符串的必备技巧下前言正文一.string中元素的访问相关接口1.1string的operator[]接口1.2string的at接口1.3string的front接口1.4string的back接口二字符串的修改与操作2.1string的push_back接口2.2string的pop_back的接口2.3string重载的operator运算符2.4string的insert接口2.5string的erase接口2.6string中的replace接口2.7string的append接口三 字符串操作相关的接口3.1 string的find接口3.2 string的substr接口C string类高效处理字符串的必备技巧下https://legacy.cplusplus.com/reference/string/string/insert/这个是查询cpp网址。前言有很长一段时间没有写文章了从今天开始将继续正常更新每周至少会更新两次博客欢迎大家来观看。本篇文章主要讲解C中STL库中元素的访问字符串修改与操作中比较常见的接口。正文一.string中元素的访问相关接口1.1string的operator[]接口在数组中我们可以通过下标访问元素而在string中我们可以通过operator重载的[]达到与下标访问同样的效果这会使得我们更改元素以及获得某一元素非常的简便。在这里插入代码片 stringop(hello world!);charxop[2];coutx;op[0]H;coutopendl;而通过这种方式返回的值是char的类型意味着他是可读可写的但是需要注意不要越界因为通过这种方式进行的访问系统有可能并不能准确的检查出来程序还可能继续运行这就会造成隐藏的错误即 C 中的『未定义行为』Undefined Behavior。1.2string的at接口如果我们想要可以进行边界检查的访问方法string中还有一个at的接口是为了避免这种未定义的行为他的使用是如下的方式在这里插入代码片 stringop(hello world!);charyop.at(2);// 正常访问charxop[2];// 正常访问couty xendl;// 输出: l l// ⚠️ 演示 at() 的边界检查请取消下面的注释运行试试// char err op.at(20); // 此行一旦取消注释程序会立刻抛出 std::out_of_range 异常并崩溃1.3string的front接口这个接口的作用是获取第一个元素。虽然通过 op[0] 或者 op.at(0) 也能达到相同的效果但 front() 的语义更加明确且在配合泛型编程模板时具有极高的通用性因为并非所有容器都支持 [] 访问。需要注意的是它同样返回的是 char 引用允许直接修改。另外在空字符串上调用 front() 会直接报错比 [] 更容易发现错误。在这里插入代码片 stringop(hello world!);charxop.front();// 获取第一个元素coutxendl;op.front()H;// 修改第一个元素1.4string的back接口这个接口我们看名字就可以猜到他是获取最后一个元素他的用法与上面的front的用法是相同的所以在这里就不再举例子了。二字符串的修改与操作2.1string的push_back接口当我们想在string的后面进行尾插的时候就可以使用这个接口下面是他的使用方法在这里插入代码片 stringop(hello world!);for(charit:op){coutit ;}coutendl;op.push_back(x);for(charit:op){coutit ;}需要注意的是每次尾插只能尾插一个字符不可以一次尾插一个字符串。2.2string的pop_back的接口既然有尾部追加自然就有尾部删除。pop_back() 的作用就是移除字符串的最后一个字符。在这里插入代码片 stringop(hello);op.pop_back();// 删除最后一个字符 ocoutopendl;// 输出 hell注意pop_back() 一次只能删除一个字符且不能传入任何参数。它在空字符串上调用会导致未定义行为程序崩溃。2.3string重载的operator运算符前面我们讲了push_back接口他每次只能在尾部添加一个元素那有没有可以一次在尾部添加更多的元素的方法呢没错就是通过opetator重载的他可以每次添加更多的元素它也可以仅仅之加入一个元素。在这里插入代码片 stringop(hello world!);for(charit:op){coutit ;}coutendl;op xxxxxxxxxx;for(charit:op){coutit ;}2.4string的insert接口insert 是 C string 类中功能非常强大且灵活的接口。顾名思义它的作用就是在字符串的任意位置不仅仅是尾部插入其他内容。下面举出他的相关例子1.插入单个字符最常用语法string insert(size_t pos, size_t count, char ch);在下标 pos 的位置插入 count 个重复的字符 ch。在这里插入代码片 string sHello World!;// 在下标 5即两个单词中间的空格处插入 3 个感叹号s.insert(5,3,!);coutsendl;// 输出: Hello!!! World!// 在下标 0开头插入 1 个 #s.insert(0,1,#);coutsendl;// 输出: #Hello!!! World!2.插入一个 C 风格字符串或 string 对象语法string insert(size_t pos, const string str);含义在下标 pos 的位置直接插入另一个完整的字符串。在这里插入代码片 string sHello World!;string tAwesome ;// 在下标 6即 World 的 W 前面插入字符串 ts.insert(6,t);coutsendl;// 输出: Hello Awesome World!3. 插入另一个字符串的子串指定长度语法string insert(size_t pos, const string str, size_t subpos, size_t sublen);含义在 pos 位置插入 str 这个字符串中从 subpos 开始长度为 sublen 的那一段。在这里插入代码片 string sHello World!;string tabcdefg;// 在下标 6 处插入 t 中从下标 2 (c) 开始截取 3 个字符 (cde)s.insert(6,t,2,3);coutsendl;// 输出: Hello cdeWorld!4.插入字符数组指针语法string insert(size_t pos, const char* s, size_t n);含义在 pos 位置插入字符数组 s 的前 n 个字符。在这里插入代码片 string sHello;constchar*arr123456;// 在下标 3 处插入 arr 的前 4 个字符 (1234)s.insert(3,arr,4);coutsendl;// 输出: Hel1234lo2.5string的erase接口有插入的接口当然就会有删除的接口而erase就是为了删除元素而设立的接口下面是他的用法1. 用法一删除指定位置的【单个字符】语法string erase(size_t pos 0, size_t len npos);含义从下标 pos 开始删除 len 个字符。在这里插入代码片#includeiostream#includestringusingnamespacestd;intmain(){string sHello World!;// 删除从下标 0 开始的 1 个字符即删除首字符 Hs.erase(0,1);coutsendl;// 输出: ello World!// 删除从下标 5 开始的 1 个字符即删除空格s.erase(5,1);coutsendl;// 输出: elloWorld!return0;}2. 用法二删除指定位置的【一大段字符】语法string erase(size_t pos 0, size_t len npos);含义它的语法和上面一模一样只要你给的 len 大于 1 即可。但是 如果 len 特别大的时候超过字符串的个数或者用默认的 npos它会一直删到字符串的末尾。在这里插入代码片 string sHello World!;// 从下标 6 开始删除后面所有的字符即删掉 World!// 通过 string::npos 代表“直到字符串结束”s.erase(6);coutsendl;// 输出: Hello 3.用法三使用【迭代器】删除标准 STL 风格语法iterator erase(const_iterator p); 或 iterator erase(const_iterator first, const_iterator last);含义传入迭代器位置指针删除该位置的字符或者删除两个迭代器之间的所有字符。这种写法比较底层常用于配合 find 或循环使用。在这里插入代码片 string sHello World!;// 获取指向开头第一个字符的迭代器autoits.begin();// 删除第一个字符指针指向的那个字符s.erase(it);coutsendl;// 输出: ello World!2.6string中的replace接口replace 用于替换字符串中的某一段内容。最基本的语法格式如下在这里插入代码片#includeiostream#includestringusingnamespacestd;intmain(){string sI like apple.;// 我想把 apple 改成 banana。// apple 在字符串中的起始下标是 7。// apple 的长度是 5。// 新内容填入 banana。s.replace(7,5,banana);coutsendl;// 输出: I like banana.return0;}2.7string的append接口前面我们不是讲了的运算符重载吗在这里的qppend也可以做到所带来的效果而且append还可以做到从一个字符串中进行切割相加。下面是一些例子。1. 基本用法直接追加另一个字符串跟 一模一样语法str.append(another_str);在这里插入代码片#includeiostream#includestringusingnamespacestd;intmain(){string s1Hello;string s2 World!;s1.append(s2);// 把 s2 整体追加到 s1 末尾couts1endl;// 输出: Hello World!return0;}2. 进阶用法一追加另一个字符串的【子串】这是 做不到的语法str.append(源字符串, 起始下标, 截取长度);在这里插入代码片 string s1My name is ;string s2TommyLee;// 从 s2 的下标 0 开始截取 3 个字符即 Tom追加到 s1s1.append(s2,0,3);couts1endl;// 输出: My name is Tom3. 进阶用法二追加指定数量的【重复字符】语法str.append(重复次数, 具体字符);在这里插入代码片 string s结果如下;// 在末尾追加 10 个减号 -s.append(10,-);coutsendl;// 输出: 结果如下----------三 字符串操作相关的接口3.1 string的find接口find是string中高频使用的接口使用这个接口我们可以迅速的查找到我们需要的字符或字符串上面是find的四种使用方式下面来给大家展示其使用的方法1.查找单个字符串在这里插入代码片 string sI love C.;// 查找字符 vsize_t poss.find(v);if(pos!string::npos){cout找到字符 v 了下标是: posendl;// 输出: 3}2.查找完整的字符串在这里插入代码片 string sI love C and Python.;// 查找单词 Pythonsize_t poss.find(Python);if(pos!string::npos){cout找到子串了起始下标是: posendl;// 输出: 14}3.指定起始位置查找在这里插入代码片 string sapple, orange, apple, grape;// 找第一个 applesize_t first_poss.find(apple);cout第一个 apple 在下标: first_posendl;// 输出: 0// 找第二个 apple从第一个找到的位置 1 开始往后找size_t second_poss.find(apple,first_pos1);cout第二个 apple 在下标: second_posendl;// 输出: 164.限制匹配长度的查找这个用法比较特殊它允许你只匹配目标字符串的前 N 个字符。在这里插入代码片 string sI love C language.;// 我们想找 C但传入的是 C Python// 第三个参数 3表示只要求匹配前 3 个字符 (C)size_t poss.find(C Python,0,3);if(pos!string::npos){cout找到了前 3 个字符位置在: posendl;// 输出: 7 (即 C 所在的下标)}3.2 string的substr接口substr 适用于截取字符串的接口它与 resize 有着本质的不同resize 是直接在源字符串上进行修改改变长度而 substr 是截取指定区间的字符后返回一个新的字符串并不会修改源字符串。下面是substr接口的使用方法在这里插入代码片#includeiostream#includestringusingnamespacestd;intmain(){string sHello World!;// 【用法一】从下标 6 开始截取直到末尾string sub1s.substr(6);coutsub1: sub1endl;// 输出: World!// 【用法二】从下标 6 开始截取 5 个字符即截取 Worldstring sub2s.substr(6,5);coutsub2: sub2endl;// 输出: World// 【用法三】下标为 0 时截取前 5 个字符即截取 Hellostring sub3s.substr(0,5);coutsub3: sub3endl;// 输出: Helloreturn0;}

相关新闻

基于Vision Transformer与FastAPI的AR深度估计与遮挡处理实战

基于Vision Transformer与FastAPI的AR深度估计与遮挡处理实战

2026/7/14 4:36:52

1. 项目概述:当AR遇到遮挡,我们如何用深度模型“看穿”世界? 在AR(增强现实)应用里,最让人头疼的问题之一就是“遮挡”。想象一下,你正通过手机屏幕,看到一个虚拟的恐龙模型栩栩如生…

NBM5100A评估板与PIC18LF4515的低功耗设计解析

NBM5100A评估板与PIC18LF4515的低功耗设计解析

2026/7/14 4:36:52

1. NBM5100A评估板的核心功能解析NBM5100A/B评估板是安世半导体(Nexperia)推出的一款专为延长纽扣电池寿命而设计的集成电路解决方案。这款评估板最显著的特点在于其独特的"电池寿命增强器"设计理念——它并非简单地优化电池本身的性能,而是通过一套完整的…

Flask生产实践:轻量框架如何支撑高并发真实业务

Flask生产实践:轻量框架如何支撑高并发真实业务

2026/7/14 4:26:51

1. 项目概述:为什么一个轻量级 Web 框架能撑起真实业务场景“Flask Web Application with Python”——这行标题看似平淡,甚至有点教科书味儿,但在我过去十年带团队落地的83个生产级项目里,它出现频率排前三。不是Django&#xff…

各国都喜欢宝石,风格有差异

各国都喜欢宝石,风格有差异

2026/7/14 7:06:57

人天生喜欢宝石黄金。我一直呼吁电脑、车辆上大量镶嵌宝石。现在人工合成,非常便宜。各国风格不同。印度人:宝石越大越好。日本人:个头可小,要闪闪发光。中国人:要纯净品质。

AI车牌识别技术解析:10万摄像头部署与隐私风险

AI车牌识别技术解析:10万摄像头部署与隐私风险

2026/7/14 7:06:57

这次我们来看一个涉及AI监控摄像头的社会技术议题。美国多地爆发的反Flock摄像头抗议活动,揭示了10万只AI车牌识别摄像头正在大规模部署,并与移民海关执法局(ICE)数据共享的现状。这个事件不仅关乎隐私权争议,更涉及AI…

梦笔记20260714

梦笔记20260714

2026/7/14 7:06:57

在老家北边的马路上,突然想起这几天与人约好讨论泰山OFFICE的事。我给忘记了。一会看到对方开着个木屋飞速过来,还漂移。我赶紧进去,里面是对方的全体员工。桌子上是个讨论协议。我说要从头念一遍,没兴趣的先出去玩吧。墙上有一副…

基于ARM Cortex-M4的智能声音警报系统设计与实现

基于ARM Cortex-M4的智能声音警报系统设计与实现

2026/7/14 7:06:57

1. 项目背景与核心组件介绍在工业控制、智能家居和公共安全领域,可靠的声音警报系统是保障设备正常运行和人员安全的关键环节。本项目采用EPT-14A4005P压电蜂鸣器和TM4C129LNCZAD微控制器构建了一套适应多种环境的高可靠性声音警报系统。这套方案特别适合需要稳定报…

黑苹果启动故障排查实录

黑苹果启动故障排查实录

2026/7/14 7:06:57

因 Re-Size BAR 导致的黑苹果启动故障排查实录 为了装好黑苹果系统,我已经摸索了半年多。换过显卡,改过配置,重启过无数次,可问题总像一堵墙横在面前。昨晚,新显卡终于到了。捧着它,我心里那团快要熄下去的…

彻底告别60帧限制:《原神》帧率解锁工具完全指南

彻底告别60帧限制:《原神》帧率解锁工具完全指南

2026/7/14 6:56:57

彻底告别60帧限制:《原神》帧率解锁工具完全指南 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 想要在《原神》中体验更流畅的战斗画面吗?genshin-fps-unlocker这…

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

2026/7/13 7:41:16

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏社区中最成熟的文本翻译解决方…

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

2026/7/13 20:43:19

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持 【免费下载链接】raspberrypi-kernel It provides openEuler kernel source for Raspberry Pi 项目地址: https://gitcode.com/openeuler/raspberrypi-kernel 前往项目官网免费下载&…

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

2026/7/13 20:43:10

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧 【免费下载链接】integration-test The repo contains test suits for system integration test 项目地址: https://gitcode.com/openeuler/integration-test 前往项目官网免费下载:…

XUnity.AutoTranslator 游戏实时翻译插件:从原理到实战的完整指南

XUnity.AutoTranslator 游戏实时翻译插件:从原理到实战的完整指南

2026/7/14 0:06:37

1. 项目概述:当游戏语言成为一堵墙作为一名玩了十几年日系、欧美独立游戏的“老油条”,我太懂那种面对一款心仪已久、画风玩法都戳中G点的游戏,却因为语言不通而望而却步的痛了。尤其是那些基于Unity引擎开发的、体量不大但内容精良的作品&am…

2026普通文员学数据分析的价值

2026普通文员学数据分析的价值

2026/7/14 0:06:37

一、2026年普通文员学习数据分析的必要性随着数字化转型加速,数据分析技能正逐渐成为职场基础能力。普通文员学习数据分析可以提升工作效率、增强竞争力,并为职业转型提供更多可能性。二、数据分析对文员的价值自动化办公:通过数据分析工具&a…

2026从计划员到主管,生产管理者学数据分析有用吗?

2026从计划员到主管,生产管理者学数据分析有用吗?

2026/7/14 0:06:37

一、生产管理领域的职业发展路径 从计划员到主管的角色转变,是生产管理者职业发展的典型路径。计划员主要负责生产排程、库存管理和资源协调等基础工作,而主管则需要承担团队管理、决策支持和效率优化等更高级别的职责。这种转变不仅仅是职位的提升&…