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

【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 被用于在查询时返回在提供的字段中包含特定前缀的文档。有时我们可能想使用前缀查询单词&#xff0c;例如 Leonardo 的 Leo 或 Marlon Brando、Mark Hamill 或 Martin Balsam 的 Mar。 Elasticsearch 提供了一个前缀查询&#xff0c;用于获取匹配单词开头部分&a…...

GEE学习笔记 七十七:GEE学习方法简介

这是一篇关于学习方法的思考探索&#xff0c;当然我不会大篇文章介绍什么学习方法&#xff08;因为我也不是这方面的专家?&#xff09;&#xff0c;这个只是总结一下我是如何学习GEE以及在学习中遇到问题时如何解决问题的。我写这篇文章的目的就是在和一些学习GEE的新同学接触…...

20基于主从博弈的智能小区代理商定价策略及电动汽车充电管理MATLAB程序

参考文档&#xff1a;《基于主从博弈的智能小区代理商定价策略及电动汽车充电管理》基本复现仿真平台&#xff1a;MATLABCPLEX/gurobi平台优势&#xff1a;代码具有一定的深度和创新性&#xff0c;注释清晰&#xff0c;非烂大街的代码&#xff0c;非常精品&#xff01;主要内容…...

长按power键,点击重启按钮,系统重启流程一

1.有可能会涉及到如下文件 2.文件流程...

数据的TCP分段和IP分片

本文简述下TCP分段和IP分片的区别与联系。 我们知道&#xff0c;用户空间的数据拷贝到内核空间的TCP发送缓冲区&#xff08;这个是一个结构体&#xff0c;叫sk_buffer&#xff0c;简称skb&#xff09;后就由内核网络协议栈做后续的封装和发送处理了&#xff0c;用户无需考虑下…...

HTML中嵌入B站视频

HTML中嵌入B站视频 在网页中实现一个HTML播放器需要先从b站获取视频嵌入代码, 以前嵌入代码可以从视频分享那里拿到, 现在好像不行了 必须是自己投稿的视频, 从投稿管理页面才能找到 复制嵌入代码 建一个.html文件, 放入下面代码 <!DOCTYPE html> <html><head…...

Mars3D Studio 的使用方法

Mars3D Studio的使用 1、介绍&#xff1a; mars3d Studio是mars3d研发团队于近期研发上线的一款 场景可视化编辑平台。拥有资源存档、团队协作、定制材质等丰富的功能。可以实现零代码构建一个可视化三维场景。 2、功能介绍 &#xff08;1&#xff09;数据上传&#xff1a…...

Flutter For Web实践

1 什么是Flutter Flutter是Google开源的一套UI工具包&#xff0c;帮助开发者通过一套代码库高效构建多平台精美应用&#xff0c;支持移动APP、web、桌面和嵌入式平台。Flutter和其他的跨平台解决方案的实现方式上有比较大的差异。 我们以React Native&#xff08;下文简称RN&…...

【神级Python代码】作为技术xiao白如何制作一款超炫酷的黑客主题代码雨?牛逼就完了。(源码分享学习)

前言 哈喽&#xff0c;我是木子&#xff0c;今天给大家制作一款超级炫酷的代码啦。 提到《黑K帝国》&#xff0c;字符雨可谓是让人印象深刻。 所有文章完整的素材源码都在&#x1f447;&#x1f447; 粉丝白嫖源码福利&#xff0c;请移步至CSDN社区或文末公众hao即可免费。 ​…...

供应链挑战迎刃而解!桑迪亚国家实验室使出“量子杀手锏”

桑迪亚国家实验室的科学家Alicia Magann&#xff08;右&#xff09;&#xff0c;Kenneth Rudinger&#xff08;左上&#xff09;&#xff0c;Mohan Sarovar&#xff08;左下&#xff09;和Matthew Grace&#xff08;未附图&#xff09;开发了基于反馈的量子优化算法&#xff08…...

java程序设计-ssm博客管理系统

博客管理系统是一个用于创建、管理和发布博客文章的应用程序。它通常包括一个后台管理界面&#xff0c;用于管理用户、文章、评论、标签等数据。同时&#xff0c;它还包括一个前端界面&#xff0c;用于展示博客文章并提供交互功能&#xff0c;例如评论和分享。 博客管理系统可…...

从0到1一步一步玩转openEuler--17 openEuler DNF(YUM)检查更新

文章目录17.1 检查更新17.2 升级17.3 更新所有的包和它们的依赖DNF是一款Linux软件包管理工具&#xff0c;用于管理RPM软件包。DNF可以查询软件包信息&#xff0c;从指定软件库获取软件包&#xff0c;自动处理依赖关系以安装或卸载软件包&#xff0c;以及更新系统到最新可用版本…...

SpringBoot-自动配置-@Import注解与@EnableAutoConfiguration注解

Import注解 Enable* 底层依赖于 Import 注解导入一些类&#xff0c;使用 Import 导入的类会被 Spring 加载到 IOC 容器中Import 提供了4种用法&#xff1a; 1.导入Bean2.导入配置类3.导入ImportSelector实现类&#xff1b;一般用于加载配置文件中的类4.导入ImportBeanDefinitio…...

【笔记】C#一维数组、多维数组和交错数组的区别总结

文章目录前言数组的概念1&#xff0c;一维数组&#xff1a;2&#xff0c;多维数组&#xff1a;3&#xff0c;交错数组&#xff1a;区别总结结语前言 &#x1f604;大家好&#xff0c;我是writer桑&#xff0c; 这是自己整理的 C# 数组笔记&#xff0c;方便自己学习的同时分享出…...

【SpringBoot】分布式日志跟踪—通过MDC实现全链路调用日志跟踪

一.MDC 1.MDC介绍 MDC&#xff08;Mapped Diagnostic Context&#xff0c;映射调试上下文&#xff09;是 log4j 和 logback 提供的一种方便在多线程场景下记录日志的功能。MDC 可以看成是一个与当前线程绑定的Map&#xff0c;可以往其中添加键值对。MDC 中包含的内容可以被同…...

【设计模式】创建型模式

简单工厂模式 系列综述&#xff1a; xxxxxxxxx 文章目录对象创建型模式简单&#xff08;静态&#xff09;工厂模式工厂方法模式参考博客&#x1f60a;点此到文末惊喜↩︎ 对象创建型模式 简单&#xff08;静态&#xff09;工厂模式 抽象原理 抽象产品基类 &#xff1a;定义了…...

Spark Catalyst 查询优化器原理

这里我们讲解一下SparkSQL的优化器系统Catalyst&#xff0c;Catalyst本质就是一个SQL查询的优化器&#xff0c;而且和 大多数当前的大数据SQL处理引擎设计基本相同&#xff08;Impala、Presto、Hive&#xff08;Calcite&#xff09;等&#xff09;。了解Catalyst的SQL优化流程&…...

贝叶斯分析法在市场调研中的应用

一、市场调研的需求场景 在营销活动的用研调研时,我们经常会去问用户在不同平台的品类付费情况,以对比大促期间本品和竞品分别在哪些品类上具有市场优势,他们之间的差距具体在哪里、差距有多大。假如根据调研问卷结果,我们知道拼多多用户有30%的人在大促购买生鲜类,而淘宝…...

JavaEE——MyBatis将查询结果集封装进POJO实体类

简单介绍 在之前的我们比较详细的介绍过MyBatis的配置信息的时候&#xff0c;在SQL映射文件中说过我们可以直接将结果集映射到我们的POJO实体类中&#xff0c;省去了我们自己处理查询结果集的时间和代码&#xff0c;接下来我们就来演示将单条数据和多条数据映射到我们POJO实体…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...