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

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!");charx=op[2];cout<<x;op[0]='H';cout<<op<<endl;

而通过这种方式返回的值是char&的类型,意味着他是可读可写的,但是需要注意不要越界,因为通过这种方式进行的访问,系统有可能并不能准确的检查出来,程序还可能继续运行,这就会造成隐藏的错误(即 C++ 中的『未定义行为』Undefined Behavior)。

1.2string的at接口

如果我们想要可以进行边界检查的访问方法,string中还有一个at的接口是为了避免这种未定义的行为,他的使用是如下的方式:

在这里插入代码片 stringop("hello world!");chary=op.at(2);// 正常访问charx=op[2];// 正常访问cout<<y<<" "<<x<<endl;// 输出: 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!");charx=op.front();// 获取第一个元素cout<<x<<endl;op.front()='H';// 修改第一个元素
1.4string的back接口

这个接口我们看名字就可以猜到他是获取最后一个元素,他的用法与上面的front的用法是相同的,所以在这里就不再举例子了。

二字符串的修改与操作

2.1string的push_back接口

当我们想在string的后面进行尾插的时候就可以使用这个接口,下面是他的使用方法:

在这里插入代码片 stringop("hello world!");for(charit:op){cout<<it<<" ";}cout<<endl;op.push_back('x');for(charit:op){cout<<it<<" ";}

需要注意的是每次尾插只能尾插一个字符不可以一次尾插一个字符串。

2.2string的pop_back的接口

既然有尾部追加,自然就有尾部删除。pop_back() 的作用就是移除字符串的最后一个字符。

在这里插入代码片 stringop("hello");op.pop_back();// 删除最后一个字符 'o'cout<<op<<endl;// 输出 "hell"

注意:pop_back() 一次只能删除一个字符,且不能传入任何参数。它在空字符串上调用会导致未定义行为(程序崩溃)。

2.3string重载的operator+=运算符

前面我们讲了push_back接口他每次只能在尾部添加一个元素,那有没有可以一次在尾部添加更多的元素的方法呢,没错就是通过opetator重载的+=他可以每次添加更多的元素(它也可以仅仅之加入一个元素)。

在这里插入代码片 stringop("hello world!");for(charit:op){cout<<it<<" ";}cout<<endl;op+=" xxxxxxxxxx";for(charit:op){cout<<it<<" ";}
2.4string的insert接口


insert 是 C++ string 类中功能非常强大且灵活的接口。顾名思义,它的作用就是在字符串的任意位置(不仅仅是尾部)插入其他内容。
下面举出他的相关例子:

1.插入单个字符(最常用)
语法:string& insert(size_t pos, size_t count, char ch);
在下标 pos 的位置,插入 count 个重复的字符 ch。

在这里插入代码片 string s="Hello World!";// 在下标 5(即两个单词中间的空格处),插入 3 个感叹号s.insert(5,3,'!');cout<<s<<endl;// 输出: Hello!!! World!// 在下标 0(开头),插入 1 个 '#'s.insert(0,1,'#');cout<<s<<endl;// 输出: #Hello!!! World!

2.插入一个 C 风格字符串(或 string 对象)

语法:string& insert(size_t pos, const string& str);

含义:在下标 pos 的位置,直接插入另一个完整的字符串。

在这里插入代码片 string s="Hello World!";string t="Awesome ";// 在下标 6(即 "World" 的 W 前面),插入字符串 ts.insert(6,t);cout<<s<<endl;// 输出: Hello Awesome World!

3. 插入另一个字符串的子串(指定长度)
语法:string& insert(size_t pos, const string& str, size_t subpos, size_t sublen);

含义:在 pos 位置,插入 str 这个字符串中,从 subpos 开始,长度为 sublen 的那一段。

在这里插入代码片 string s="Hello World!";string t="abcdefg";// 在下标 6 处,插入 t 中从下标 2 ('c') 开始,截取 3 个字符 ("cde")s.insert(6,t,2,3);cout<<s<<endl;// 输出: Hello cdeWorld!

4.插入字符数组(指针)
语法:string& insert(size_t pos, const char* s, size_t n);

含义:在 pos 位置,插入字符数组 s 的前 n 个字符。

在这里插入代码片 string s="Hello";constchar*arr="123456";// 在下标 3 处,插入 arr 的前 4 个字符 ("1234")s.insert(3,arr,4);cout<<s<<endl;// 输出: Hel1234lo
2.5string的erase接口

有插入的接口当然就会有删除的接口,而erase就是为了删除元素而设立的接口,下面是他的用法:
1. 用法一:删除指定位置的【单个字符】
语法:string& erase(size_t pos = 0, size_t len = npos);

含义:从下标 pos 开始,删除 len 个字符。

在这里插入代码片#include<iostream>#include<string>usingnamespacestd;intmain(){string s="Hello World!";// 删除从下标 0 开始的 1 个字符(即删除首字符 'H')s.erase(0,1);cout<<s<<endl;// 输出: "ello World!"// 删除从下标 5 开始的 1 个字符(即删除空格)s.erase(5,1);cout<<s<<endl;// 输出: "elloWorld!"return0;}

2. 用法二:删除指定位置的【一大段字符】
语法:string& erase(size_t pos = 0, size_t len = npos);

含义:它的语法和上面一模一样,只要你给的 len 大于 1 即可。
但是 如果 len 特别大的时候(超过字符串的个数或者用默认的 npos),它会一直删到字符串的末尾。

在这里插入代码片 string s="Hello World!";// 从下标 6 开始,删除后面所有的字符(即删掉 "World!")// 通过 string::npos 代表“直到字符串结束”s.erase(6);cout<<s<<endl;// 输出: "Hello "

3.用法三:使用【迭代器】删除(标准 STL 风格)
语法:iterator erase(const_iterator p); 或 iterator erase(const_iterator first, const_iterator last);

含义:传入迭代器(位置指针),删除该位置的字符,或者删除两个迭代器之间的所有字符。
这种写法比较底层,常用于配合 find 或循环使用。

在这里插入代码片 string s="Hello World!";// 获取指向开头第一个字符的迭代器autoit=s.begin();// 删除第一个字符(指针指向的那个字符)s.erase(it);cout<<s<<endl;// 输出: "ello World!"
2.6string中的replace接口

replace 用于替换字符串中的某一段内容。最基本的语法格式如下:

在这里插入代码片#include<iostream>#include<string>usingnamespacestd;intmain(){string s="I like apple.";// 我想把 "apple" 改成 "banana"。// "apple" 在字符串中的起始下标是 7。// "apple" 的长度是 5。// 新内容填入 "banana"。s.replace(7,5,"banana");cout<<s<<endl;// 输出: "I like banana."return0;}
2.7string的append接口

前面我们不是讲了+=的运算符重载吗,在这里的qppend也可以做到+=所带来的效果而且append还可以做到从一个字符串中进行切割相加。下面是一些例子。
1. 基本用法:直接追加另一个字符串(跟 += 一模一样)
语法:str.append(another_str);

在这里插入代码片#include<iostream>#include<string>usingnamespacestd;intmain(){string s1="Hello";string s2=" World!";s1.append(s2);// 把 s2 整体追加到 s1 末尾cout<<s1<<endl;// 输出: Hello World!return0;}

2. 进阶用法(一):追加另一个字符串的【子串】(这是 += 做不到的)
语法:str.append(源字符串, 起始下标, 截取长度);

在这里插入代码片 string s1="My name is ";string s2="TommyLee";// 从 s2 的下标 0 开始,截取 3 个字符(即 "Tom"),追加到 s1s1.append(s2,0,3);cout<<s1<<endl;// 输出: My name is Tom

3. 进阶用法(二):追加指定数量的【重复字符】
语法:str.append(重复次数, 具体字符);

在这里插入代码片 string s="结果如下";// 在末尾追加 10 个减号 '-'s.append(10,'-');cout<<s<<endl;// 输出: 结果如下----------

三 字符串操作相关的接口

3.1 string的find接口


find是string中高频使用的接口,使用这个接口我们可以迅速的查找到我们需要的字符或字符串,上面是find的四种使用方式,下面来给大家展示其使用的方法
1.查找单个字符串

在这里插入代码片 string s="I love C++.";// 查找字符 'v'size_t pos=s.find('v');if(pos!=string::npos){cout<<"找到字符 'v' 了,下标是: "<<pos<<endl;// 输出: 3}

2.查找完整的字符串

在这里插入代码片 string s="I love C++ and Python.";// 查找单词 "Python"size_t pos=s.find("Python");if(pos!=string::npos){cout<<"找到子串了,起始下标是: "<<pos<<endl;// 输出: 14}

3.指定起始位置查找

在这里插入代码片 string s="apple, orange, apple, grape";// 找第一个 "apple"size_t first_pos=s.find("apple");cout<<"第一个 apple 在下标: "<<first_pos<<endl;// 输出: 0// 找第二个 "apple":从第一个找到的位置 + 1 开始往后找size_t second_pos=s.find("apple",first_pos+1);cout<<"第二个 apple 在下标: "<<second_pos<<endl;// 输出: 16

4.限制匹配长度的查找
这个用法比较特殊,它允许你只匹配目标字符串的前 N 个字符。

在这里插入代码片 string s="I love C++ language.";// 我们想找 "C++",但传入的是 "C++ Python"// 第三个参数 3,表示只要求匹配前 3 个字符 ("C++")size_t pos=s.find("C++ Python",0,3);if(pos!=string::npos){cout<<"找到了前 3 个字符,位置在: "<<pos<<endl;// 输出: 7 (即 'C' 所在的下标)}
3.2 string的substr接口

substr 适用于截取字符串的接口,它与 resize 有着本质的不同:resize 是直接在源字符串上进行修改(改变长度);而 substr 是截取指定区间的字符后,返回一个新的字符串,并不会修改源字符串。
下面是substr接口的使用方法:

在这里插入代码片#include<iostream>#include<string>usingnamespacestd;intmain(){string s="Hello World!";// 【用法一】:从下标 6 开始截取,直到末尾string sub1=s.substr(6);cout<<"sub1: "<<sub1<<endl;// 输出: World!// 【用法二】:从下标 6 开始,截取 5 个字符(即截取 "World")string sub2=s.substr(6,5);cout<<"sub2: "<<sub2<<endl;// 输出: World// 【用法三】:下标为 0 时,截取前 5 个字符(即截取 "Hello")string sub3=s.substr(0,5);cout<<"sub3: "<<sub3<<endl;// 输出: Helloreturn0;}
http://www.jsqmd.com/news/1184946/

相关文章:

  • Streamlit大模型部署:突破100MB限制的两种生产方案
  • 哪个降 AI 率软件敢承诺效果?降不到就退钱
  • 抓包工具全攻略——Fiddler/Charles/Wireshark代理配置、HTTPS解密、请求重放与流量分析
  • mitmproxy中间人代理实战——脚本扩展、请求/响应修改与自动化处理
  • Polars/Ruff/Litestar等六项Python工程化升级实践
  • 2026最新自贡本地漏水检测公司本地精选权威推荐:正规防水补漏公司优选口碑TOP5:卫生间/厨房/阳台/飘窗/地下室渗漏水维修师傅上门 - 即刻修防水
  • 内网渗透深度实战指南:从单点突破到域控沦陷,手把手拆解横向移动全链路
  • 模块化提示词工程:为Python Web应用构建可复用的Prompt电路板
  • 2026年7月浙江GEO优化/宁波GEO第三方外包公司实力推荐_宁波奥凯盛鼎信息科技有限公司 - 行业平台推荐
  • C++20协程:从回调地狱到异步编程新范式
  • 2026甄选:苏州手表回收服务公司,名表高价回收、当日变现与专业鉴宝诚信服务解析 - 甄选服务推荐
  • 答辩前急用选哪个降 AI 率软件?上传几分钟就出稿
  • 商业分析与数据科学:职业路径选择的底层逻辑与实战指南
  • MAX77654与TM4C1294NCZAD电源管理方案设计
  • C++ STL核心组件解析:容器、迭代器与算法实战指南
  • 2026实力之选:高稳定性环保欧松板源头品牌深度解析 - 甄选服务推荐
  • 期末大作业:基于 Python 的知识库管理系统​
  • C盘清理全攻略:从基础操作到进阶技巧,安全释放30G+空间
  • Claude Mythos Preview:通用AI安全能力跃迁与认知韧性防御
  • 跨平台服务器电源管理实战:BIOS、任务计划与智能硬件方案详解
  • LLM应用安全实战:七类高频攻击面与四层纵深防御体系
  • 逆向工程与软件授权机制:从Beyond Compare密钥生成器看软件保护技术
  • Hermes通用架构分析
  • AI视频修复技术解析:从4K超分到经典舞台保存实践
  • 多维聚合实战:银行风控中的groupby高级用法与避坑指南
  • 2026 长三角非标自动化产线升级行业调研报告:原厂・代理商・集成商选型深度分析 - 芈只AI研究院
  • 基于Mediapipe与Unity的实时人体姿态捕捉与驱动实践
  • Snyk Agent Fix 新架构:全面支持 C/C++ 全语言漏洞修复
  • C++学生管理系统实战:从静态数组到STL vector的面向对象设计
  • wordbuddy+Obsidian 搭建Ai知识库