【C++】string类(下)
文章目录
- 1.迭代器(正向遍历)
- begin有两个版本
- 2.反向迭代器(反向遍历)
- rbegin由两个版本
- 3. at
- 4. insert ——头插
- 在pos位置前插入一个字符串
- 在pos位置前插入n个字符
- 在迭代器前插入一个字符
- 5. erase
- 从pos位置开始删除len个字符
- 从迭代器位置开始删除
- 6. replace——替换
- 从pos位置开始的n个字符替换成想要的字符
- 7. find ——查找
- 例题 替换空格
- 8. swap ——交换
- 9. c_str
- 10. substr
- 11. getline
1.迭代器(正向遍历)
#include<iostream>
#include<string>
using namespace std;
//迭代器
int main()
{string s("hello world");string::iterator it = s.begin();//遍历字符串while (it != s.end()){cout << *it << " ";it++;}return 0;
}

- s.begin()返回指向第一个位置的指针,s.end()返回指向最后一个位置的下一个的指针
begin有两个版本
#include<iostream>
#include<string>
using namespace std;
void func(const string& s1)
{string::iterator it = s1.begin();//会报错while (it != s1.end()){cout << *it << endl;it++;}
}
int main()
{string s("hello world");func(s);return 0;
}
当我们想要在一个函数中实现迭代器,发现会报错是因为begin一共有两个版本

- 当函数的参数为const时,需要返回const的迭代器
#include<iostream>
#include<string>
using namespace std;
void func(const string& s1)
{string::const_iterator it = s1.begin();//会报错while (it != s1.end()){//*it = 2; //由于it可以看作指针,由const修饰后,it指向的内容不能被修改cout << *it << endl;it++;}
}
int main()
{string s("hello world");func(s);return 0;
}
- it可以看作指针,由const修饰后,it指向的内容不能被修改
- 只能遍历和读容器的数据,不能写
2.反向迭代器(反向遍历)
#include<iostream>
#include<string>
using namespace std;int main()
{//F反向迭代器string s("hello world");string::reverse_iterator rit = s.rbegin();while (rit != s.rend()){cout << *rit <<" "; //d l r o w o l l e hrit++;}return 0;
}

- s.rbegin()返回指向最后一个位置的指针,s.rend()返回指向第一个位置前一个的指针
rbegin由两个版本

- 同样反向迭代器的rbegin也存在两个版本,一个不用const和一个用const修饰的
#include<iostream>
#include<string>
using namespace std;
int main()
{string s("hello");string::const_reverse_iterator rit = s.rbegin();while (rit != s.rend()){//*rit = 2; 会报错cout << *rit << endl;*rit++;}return 0;
}
- rit可以看作指针,由const修饰后,rit指向的内容不能被修改
- 与it的const版本特性一致,只能遍历和读容器的数据,不能写
3. at
- 返回pos位置的字符

- 如果访问越界,opertaor[ ]会直接报错

- 访问越界,at会抛异常
4. insert ——头插
在pos位置前插入一个字符串
- string& insert (size_t pos, const string& str);
#include<iostream>
#include<string>
using namespace std;
int main()
{string s("world");s.insert(0, "hello");//0位置前插入字符串cout << s << endl;//helloworldreturn 0;
}
在pos位置前插入n个字符
- string& insert (size_t pos, size_t n, char c);
#include<iostream>
#include<string>
using namespace std;
int main()
{string s("world");s.insert(0,1,'!');//pos位置插入1个字符!cout << s << endl;return 0;
}
在迭代器前插入一个字符
- iterator insert (iterator p, char c);
#include<iostream>
#include<string>
using namespace std;
int main()
{string s("world1");s.insert(s.begin()+5, '!');cout << s << endl;//world!1return 0;
}
s.begin()代表开头的位置,s.begin()+5代表1的位置,在1之前插入字符!
5. erase
从pos位置开始删除len个字符
- string& erase (size_t pos = 0, size_t len = npos);
npos代表缺省值,即整数最大值
若len长度大于字符pos位置后的长度或者不给len值自动使用npos, 则pos位置之后全部删除
#include<iostream>
#include<string>
using namespace std;
int main()
{string s("hello world");s.erase(0, 5);s.erase(2);//2位置后全部删除cout << s << endl;// world
}
- 0位置开始,删除5个字符
从迭代器位置开始删除
- iterator erase (iterator p);
#include<iostream>
#include<string>
using namespace std;
int main()
{string s("hello world");s.erase(s.begin()+1);cout << s << endl;//hllo world
}
从迭代器位置开始删除一个字符
6. replace——替换
从pos位置开始的n个字符替换成想要的字符
- string& replace (size_t pos, size_t len, const char* s);
#include<iostream>
#include<string>
using namespace std;
int main()
{string s("hello world");s.replace(5, 1, "%%d");cout << s << endl;
}
从下标为5的位置开始的1个字符 替换成%%d
7. find ——查找
- size_t find (char c, size_t pos = 0) const;
- 查找字符,找到了返回当前pos位置的下标,没有找到就返回npos(整形最大值)
例题 替换空格
将空格替换成%20
#include<iostream>
#include<string>
using namespace std;
//替换空格问题
int main()
{string s("i love you");int i = 0;int sum = 0;for (i = 0; i < s.size(); i++){sum++;}s.reserve(s.size() + 2 * sum);//提前开空间,避免replace扩容size_t pos = s.find(' ');while (pos != string::npos){s.replace(pos, 1, "%20");pos = s.find(' ', pos + 3);//跳过上一次已经替换过的空格}cout << s << endl;return 0;
}
- 通过使用reserve提前扩容,以及跳过上一次已经替换的空格进行效率提升
8. swap ——交换
- void swap (string& str);
#include<iostream>
#include<string>
using namespace std;
int main()
{string s1("abc");string s2("wer");s1.swap(s2);//string类中swapcout << s1 << endl;cout << s2 << endl;swap(s1, s2);//类模板中的swapcout << s1 << endl;cout << s2 << endl;return 0;
}
string类中swap与类模板中的swap功能相同,
但string类的swap只能针对string完成交换,而类模板的swap,可以对任意类型完成交换
string类的swap更高效一点,直接修改两者指针的指向
- 修改s1指针指向原来s2指向的空间,修改s2指针指向原来s1指针指向的空间
9. c_str
- const char*类型的指针
#include<iostream>
#include<string>
using namespace std;
int main()
{string s("hello world");cout << s << endl;//自定义类型 运算符重载<<cout << s.c_str() << endl;//返回一个const char*指针,按照字符串打印 遇见'\0'结束return 0;
}
10. substr
- 从pos位置取len个字符的子串
- string substr (size_t pos = 0, size_t len = npos) const;
- 从后往前查找字符
#include<iostream>
#include<string>
using namespace std;
int main()
{string file("test.zip.c");size_t pos = file.rfind('.');//倒着查找字符.if (pos != string::npos){string suffix = file.substr(pos);cout << suffix << endl;}return 0;
}
有可能存在多个.存在,所以从后往前找后缀名
11. getline
- 用来解决cin遇见空格停止的情况
- 流提取默认使用空格/换行是多个值之间的分隔符 getline遇到换行结束
- stream& getline (istream& is, string& str);
#include<iostream>
#include<string>
using namespace std;
int main()
{//cin>>s//输入 hello world 错误写法getline(cin,s);//正确写法return 0;
}
若输入hello world,cin会当成两个值,若想把hello world当成一个整体使用getline
相关文章:
【C++】string类(下)
文章目录1.迭代器(正向遍历)begin有两个版本2.反向迭代器(反向遍历)rbegin由两个版本3. at4. insert ——头插在pos位置前插入一个字符串在pos位置前插入n个字符在迭代器前插入一个字符5. erase从pos位置开始删除len个字符从迭代器位置开始删除6. replace——替换从pos位置开始…...
Elasticsearch: Prefix queries - 前缀查询
Prefix queries 被用于在查询时返回在提供的字段中包含特定前缀的文档。有时我们可能想使用前缀查询单词,例如 Leonardo 的 Leo 或 Marlon Brando、Mark Hamill 或 Martin Balsam 的 Mar。 Elasticsearch 提供了一个前缀查询,用于获取匹配单词开头部分&a…...
GEE学习笔记 七十七:GEE学习方法简介
这是一篇关于学习方法的思考探索,当然我不会大篇文章介绍什么学习方法(因为我也不是这方面的专家?),这个只是总结一下我是如何学习GEE以及在学习中遇到问题时如何解决问题的。我写这篇文章的目的就是在和一些学习GEE的新同学接触…...
20基于主从博弈的智能小区代理商定价策略及电动汽车充电管理MATLAB程序
参考文档:《基于主从博弈的智能小区代理商定价策略及电动汽车充电管理》基本复现仿真平台:MATLABCPLEX/gurobi平台优势:代码具有一定的深度和创新性,注释清晰,非烂大街的代码,非常精品!主要内容…...
长按power键,点击重启按钮,系统重启流程一
1.有可能会涉及到如下文件 2.文件流程...
数据的TCP分段和IP分片
本文简述下TCP分段和IP分片的区别与联系。 我们知道,用户空间的数据拷贝到内核空间的TCP发送缓冲区(这个是一个结构体,叫sk_buffer,简称skb)后就由内核网络协议栈做后续的封装和发送处理了,用户无需考虑下…...
HTML中嵌入B站视频
HTML中嵌入B站视频 在网页中实现一个HTML播放器需要先从b站获取视频嵌入代码, 以前嵌入代码可以从视频分享那里拿到, 现在好像不行了 必须是自己投稿的视频, 从投稿管理页面才能找到 复制嵌入代码 建一个.html文件, 放入下面代码 <!DOCTYPE html> <html><head…...
Mars3D Studio 的使用方法
Mars3D Studio的使用 1、介绍: mars3d Studio是mars3d研发团队于近期研发上线的一款 场景可视化编辑平台。拥有资源存档、团队协作、定制材质等丰富的功能。可以实现零代码构建一个可视化三维场景。 2、功能介绍 (1)数据上传:…...
Flutter For Web实践
1 什么是Flutter Flutter是Google开源的一套UI工具包,帮助开发者通过一套代码库高效构建多平台精美应用,支持移动APP、web、桌面和嵌入式平台。Flutter和其他的跨平台解决方案的实现方式上有比较大的差异。 我们以React Native(下文简称RN&…...
【神级Python代码】作为技术xiao白如何制作一款超炫酷的黑客主题代码雨?牛逼就完了。(源码分享学习)
前言 哈喽,我是木子,今天给大家制作一款超级炫酷的代码啦。 提到《黑K帝国》,字符雨可谓是让人印象深刻。 所有文章完整的素材源码都在👇👇 粉丝白嫖源码福利,请移步至CSDN社区或文末公众hao即可免费。 …...
供应链挑战迎刃而解!桑迪亚国家实验室使出“量子杀手锏”
桑迪亚国家实验室的科学家Alicia Magann(右),Kenneth Rudinger(左上),Mohan Sarovar(左下)和Matthew Grace(未附图)开发了基于反馈的量子优化算法(…...
java程序设计-ssm博客管理系统
博客管理系统是一个用于创建、管理和发布博客文章的应用程序。它通常包括一个后台管理界面,用于管理用户、文章、评论、标签等数据。同时,它还包括一个前端界面,用于展示博客文章并提供交互功能,例如评论和分享。 博客管理系统可…...
从0到1一步一步玩转openEuler--17 openEuler DNF(YUM)检查更新
文章目录17.1 检查更新17.2 升级17.3 更新所有的包和它们的依赖DNF是一款Linux软件包管理工具,用于管理RPM软件包。DNF可以查询软件包信息,从指定软件库获取软件包,自动处理依赖关系以安装或卸载软件包,以及更新系统到最新可用版本…...
SpringBoot-自动配置-@Import注解与@EnableAutoConfiguration注解
Import注解 Enable* 底层依赖于 Import 注解导入一些类,使用 Import 导入的类会被 Spring 加载到 IOC 容器中Import 提供了4种用法: 1.导入Bean2.导入配置类3.导入ImportSelector实现类;一般用于加载配置文件中的类4.导入ImportBeanDefinitio…...
【笔记】C#一维数组、多维数组和交错数组的区别总结
文章目录前言数组的概念1,一维数组:2,多维数组:3,交错数组:区别总结结语前言 😄大家好,我是writer桑, 这是自己整理的 C# 数组笔记,方便自己学习的同时分享出…...
【SpringBoot】分布式日志跟踪—通过MDC实现全链路调用日志跟踪
一.MDC 1.MDC介绍 MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 和 logback 提供的一种方便在多线程场景下记录日志的功能。MDC 可以看成是一个与当前线程绑定的Map,可以往其中添加键值对。MDC 中包含的内容可以被同…...
【设计模式】创建型模式
简单工厂模式 系列综述: xxxxxxxxx 文章目录对象创建型模式简单(静态)工厂模式工厂方法模式参考博客😊点此到文末惊喜↩︎ 对象创建型模式 简单(静态)工厂模式 抽象原理 抽象产品基类 :定义了…...
Spark Catalyst 查询优化器原理
这里我们讲解一下SparkSQL的优化器系统Catalyst,Catalyst本质就是一个SQL查询的优化器,而且和 大多数当前的大数据SQL处理引擎设计基本相同(Impala、Presto、Hive(Calcite)等)。了解Catalyst的SQL优化流程&…...
贝叶斯分析法在市场调研中的应用
一、市场调研的需求场景 在营销活动的用研调研时,我们经常会去问用户在不同平台的品类付费情况,以对比大促期间本品和竞品分别在哪些品类上具有市场优势,他们之间的差距具体在哪里、差距有多大。假如根据调研问卷结果,我们知道拼多多用户有30%的人在大促购买生鲜类,而淘宝…...
JavaEE——MyBatis将查询结果集封装进POJO实体类
简单介绍 在之前的我们比较详细的介绍过MyBatis的配置信息的时候,在SQL映射文件中说过我们可以直接将结果集映射到我们的POJO实体类中,省去了我们自己处理查询结果集的时间和代码,接下来我们就来演示将单条数据和多条数据映射到我们POJO实体…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
