【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实体…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
