【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实体…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...