尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

C++ string类:高效处理字符串的必备技巧(下)
📅 发布时间:2026/7/14 4:49:26

文章目录

    • 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;}

相关新闻

  • 抓包工具全攻略——Fiddler/Charles/Wireshark代理配置、HTTPS解密、请求重放与流量分析
  • mitmproxy中间人代理实战——脚本扩展、请求/响应修改与自动化处理
  • 2026最新自贡本地漏水检测公司本地精选权威推荐:正规防水补漏公司优选口碑TOP5:卫生间/厨房/阳台/飘窗/地下室渗漏水维修师傅上门 - 即刻修防水

最新新闻

  • 卡地亚中国官方售后服务中心|服务热线及全部维修详细地址权威信息声明(2026年7月最新) - 卡地亚官方售后中心
  • 元初混沌 6G 全域通感一体化体系架构 第一卷二阶第二十四篇 组网长期周期性节律演化分析
  • DeepSeek mHC技术:革新LLM残差连接架构的突破
  • python核心语法
  • 梦笔记20260714
  • 真力时售后维修店腕表精准维修与保养服务权威公示(2026年7月最新) - 亨得利官方服务中心

日新闻

  • AWS SSM安全运维实践:零公网暴露的合规远程开发方案
  • Tableau 2024.1 图表选择指南:5种业务场景与最佳图表类型匹配
  • dsPIC33FJ与CMT-8540S-SMT在嵌入式音频处理中的高效应用

周新闻

  • IX9104 PCIe5.0 高速交换芯片@ACP#完整规格 + 应用场景总结
  • Unity游戏集成Coze智能体:实现NPC智能对话与知识库联动
  • SAP EPIC 建行回单查询:从标准类CL_EPIC_EXAMPLE_CN_CCB_GHTD到Z类的5处关键修改

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号