【C++】string类(接口使用详解 下)

        我们接着【C++】string类(接口使用详解 上)-CSDN博客  继续介绍string的使用。

1.string类对象的修改操作

我们就说一下用的比较多的接口。 

1.1 operator+=

这个接口可以尾插一个字符,或者一个字符串,或者一个对象

string s1("hello world!");
string s2("qqqqqqq");
s1 += 'x';  // 尾插一个字符
s1 += "yyyyy"; //尾插一个字符串
s1 += s2; //尾插一个对象
cout << s1 << endl;

在实践中直接用这个接口尾插就行。

1.2 append 和 push_back

这两个接口也是尾插的,了解一下即可,我们一般就用前面介绍的operator+=。

 push_back是尾插一个字符

append是尾插一个字符串,对象,对象的一部分等等,详细的看文档。 

string s1("hello world!");
s1.push_back('q'); //尾插一个字符
s1.append("xxxxxx"); //尾插字符串

 常用的用法就是上面这样,append的其他接口基本不咋用。

1.3 insert

这是插入数据的接口,提供了7个,不过大部分用的不多。

常用的用法就两个,用这个头插,或者字符串中间位置插入数据。其他接口用的不多。

string s1("hello world!");
cout << s1 << endl;
s1.insert(0, 2, 'a'); //在下标为0的位置开始插入2个a
cout << s1 << endl;

string s1("hello world!");
cout << s1 << endl;
s1.insert(0, 2, 'a'); 
cout << s1 << endl;
s1.insert(8, 4, 'x');
cout << s1 << endl;

但是头插和中间插入的使用需谨慎,我们学过顺序表可以知道,头插或者中间插入需要把后面的数据都往后移动,如果空间不够还要扩容。

在使用这些接口的时候,不确定用法就看文档介绍。

1.4 erase

erase是用来删除数据的。

在实践中用的最多的还是第一个接口:从pos的位置开始删除npos个数据。

    string s1("hello world");
	s1.erase(6, 1); //从下标为6的位置,删除1个数据
	cout << s1 << endl; 

 如果我们要头删,如下。

   	s1.erase(0, 1); //头删 
	cout << s1 << endl;

这个接口的npos也是缺省参数,pos位置后面字符剩多少就是多少 。

如果我们想把pos位置之后的全删了,第二个参数可以不传,就用npos的缺省值。

	string s1("hello world");
	s1.erase(6); //从6的位置开始后面全删除 
	cout << s1 << endl;

  

 还提供了一个迭代器的版本,就是(3).

 用迭代器版本头删也可以。

s1.erase(s1.begin()); //迭代器版头删 
cout << s1 << endl;

  用迭代器版本尾删也可以。

s1.erase(--s1.end()); //迭代器版尾删 
cout << s1 << endl;

 注意括号里是s1.end()的前置减减,因为end()返回的是最后一个字符的下一位,减减end()才是返回最后一个字符。

//迭代器版尾删另一种写法
s1.erase(s1.size()-1, 1); 

1.5 replace

replace就是替换,它提供的接口也是非常多。

大概就是我们可以把pos位置开始的len个字符替换字符串、字符串的一部分,对象,对象的一部分,迭代器,迭代器的一部分。来简单运用一下。

少被替换多

string s1("hello world");
//把5位置开始的1个字符替换成2个%
s1.replace(5, 1, "%%");
cout << s1 << endl;

 

 多被替换少

string s1("hello world");
s1.replace(5, 1, "%%");
cout << s1 << endl;
//把0开始的4个字符替换成3个x	
s1.replace(0, 4, "xxx");
cout << s1 << endl;

 等大小替换

	s1.replace(0, 3, "yyy");
	cout << s1 << endl;

1.6 swap和pop_back

一个是交换,一个是尾删,了解一下即可。

 

 string的其他接口在这就不一一介绍了,大家在使用的时候不清楚的话查一下文档就好了。

 2.find系列接口

2.1 find

 从pos位置查找字符,字符串,对象,返回值是size_t类型。

如果找到了,返回找到的第一个目标的下标位置。 如果没找到,返回npos。

举个例子。

string s2("hello world hello csdn");
size_t pos = s2.find(" "); //找空格

如果我们找到空格,把空格全部换成%%。

size_t pos = s2.find(" "); //找空格,把下标存在pos里 
while (pos != string::npos) 
{
	s2.replace(pos, 1, "%%"); //替换 
	pos = s2.find(" "); //找下一个空格 
}
cout << s2 << endl; 

 但是这样写的话,我们不给第二个参数传参,find每次都要从头找,很麻烦,我们给第二个参数传参,可以从指定位置开始找。把while循环里面的第二条语句改一下。

while (pos != string::npos) 
{
	s2.replace(pos, 1, "%%"); //替换 
	pos = s2.find(" ", pos + 2); //pos+2位置开始找下一个空格 
}

这里第二个参数是pos+2,是因为我们把空格这一个字符替换成了两个%。结果是一样的。

2.2 rfind 和substr

rfind和find差不多,只不过rfind是倒着找

substr是把pos位置的len个字符拿出来拷贝到新的string里,这里npos是老朋友了,如果npos不给值,就是拷贝到结尾。返回值类型是string。

rfind和substr结合起来用,可以用在找文件的后缀。

//假设文件是string.cpp
string s3("string.cpp");  
size_t pos = s3.rfind('.'); //从后开始找. 
string suffix = s3.substr(pos); //找到后把后缀存到suffix里 
cout << suffix << endl;

//假设文件是string.cpp.zip
string s3("string.cpp.zip");  
size_t pos = s3.rfind('.'); //从后开始找. 
string suffix = s3.substr(pos); //找到后把后缀存到suffix里 
cout << suffix << endl;

2.3 find_first_of

名字看起来是找第一个,其实并不是,别被名字迷惑哦。

find_first_of 是找任意一个字符,举个例子,如下。

string str ("Please, replace the vowels in this sentence by asterisks.");
cout << str << '\n';
size_t found = str.find_first_of("abcd");//找abcd的任意一个,a或者b或者c或者d 
while (found!=string::npos)
{
  str[found]='*';  //只要是a或者b或者c或者d都会被替换成* 
  found=str.find_first_of("abcd",found+1);
}
cout << str << '\n';

大家一定不能被名字迷惑!是传的任意一个字符都会被找到!

从下面这句代码也可以看出,第二个参数是从pos位置开始找,不传默认为0位置开始

found=str.find_first_of("abcd",found+1);

2.4 find_last_of

这个函数和find_first_of 功能是一样的,只不过是从后面往前找

举个例子,还是用文件举例。假设我们要把文件路径和文件名分隔开看,Windows和Linux下的文件分隔符不一样,Windows下是\,Linux下是/,代码如下。

void SplitFilename (const std::string& str)
{
  cout << "Splitting: " << str << '\n';
  size_t found = str.find_last_of("/\\");//从后往前,找/和\\的任意一个 
  cout << " path: " << str.substr(0,found) << '\n';
  cout << " file: " << str.substr(found+1) << '\n';
}

int main ()
{
  string str1 ("/usr/bin/man"); //Linux路径 
  string str2 ("c:\\windows\\winhelp.exe");//Windows路径 

  SplitFilename (str1);
  SplitFilename (str2);

  return 0;
}

2.5  find_first_not_of和find_last_not_of

这两个和find_first_of、find_last_of相反,比如说前面我们要把是abcd任意一个的找到,这两个接口就是把不是abcd任意一个都找到。

 

那我们还是拿前面的abcd举例吧,这次换成abcdef。

string str ("Please, replace the vowels in this sentence by asterisks.");
cout << str << '\n';
size_t found = str.find_first_not_of("abcdef");//找不是abcdef的任意一个
while (found!=string::npos)
{
  str[found]='*';  //除了abcdef,其它都会被替换成* 
  found=str.find_first_of("abcdef",found+1);
}
cout << str << '\n';

 除了abcdef,其它都被替换成*了。

find_last_not_of是一样的,只是从后往前找。

3.string类的非成员函数

 3.1 operator+

这个函数为什么没有写成成员函数,而是重载成全局的呢?因为它主要想支持字符串+string的功能。如下。

	string s4("hello");
	string s5 = s4 + "world";//string+字符串
	cout << s5 << endl; 
	string s6 = "world" + s4;//字符串+string 
	cout << s6 << endl;

 我们说过重载运算符,二元的,两个操作数左右顺序一一对应,如果是成员函数,左操作数只能是string,重载成全局的函数,就可以支持字符串是左操作数。

3.2 比较大小

比较大小的接口也是重载了一大堆,在这里就不说了 。

3.3 <<、>>、 swap 

swap留到后面再说,流插入和流提取也没啥说的~

3.4 getline

 cin和scanf默认我们输入空格或者换行符就停止一个输入,如果我们要输入hello world,输入到str里,str只会存hello进去,world会认为是另一个对象的。

我们用getline输入的话,第一个参数传cin,第二个参数传对象,第三个参数不传,默认以换行符未结束标志

 第三个参数传的话,传什么,就以什么为结束标志。

 string的其他接口在这就不一一介绍了,大家在使用的时候不清楚的话查一下文档就好了。

到这string的使用就全部说完了,拜拜~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/894695.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

回归测试内容多,时间紧,人还少,怎么办?

问答网站上看到一个提问&#xff1a; 项目进入测试&#xff0c;但回归测试内容多&#xff0c;发布时间紧迫&#xff0c;人还少&#xff0c;要怎么做&#xff1f; 标准答案应该是自动化测试 回归测试主要关注的是历史功能&#xff0c;如果自动化测试覆盖率达到一定程度的话&…

lazyLoad

//1.通过React的lazy函数配合import()函数动态加载路由组件 > 路由组件代码会被分开打包 const Login lazy(()>import(/pages/Login)) //2.通过<Suspense>指定在加载得到路由打包文件前显示一个自定义loading界面 <Suspense fallback{<h1&…

探索Spring Cloud Config:构建高可用的配置中心

目录 认识Spring Cloud ConfigConfig Server读取配置文件步骤1&#xff1a;&#xff08;1&#xff09;创建config-server项目&#xff08;2&#xff09;在config-server中开启Config Server功能&#xff08;3&#xff09;在config-server配置文件进行相关配置&#xff08;4&…

计算机毕业设计Python深度学习房价预测 房源可视化 房源爬虫 二手房可视化 二手房爬虫 递归决策树模型 机器学习 深度学习 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 房地产是促进我国经济持续增…

征程 6E DISPLAY 功能介绍及上手实践

01 功能概述 本文将带大家一起实现单路、多路 MIPI CSI TX 输出、IDU 回写、IDU oneshot 模式、绑定输出 VPS 数据等功能&#xff0c;此处主要介绍各 sample 的实现与使用方法。 02 软件架构说明 本文中绑定 VPS 输出功能基于 libvio API 实现&#xff0c;调用 libvio 提供的…

Ubuntu16.04安装openssl库

Ubuntu16.04安装openssl库 Chapter1 Ubuntu16.04安装openssl库 Chapter1 Ubuntu16.04安装openssl库 原文链接&#xff1a;https://blog.csdn.net/weixin_36584476/article/details/107321893 记录一下省得忘了 1.首先去openssl官网下载源码www.openssl.org/source/&#xff0…

西瓜书书本内容杂谈

西瓜书书本内容杂谈 把圈子变小&#xff0c;把语速放缓&#xff0c;把心放宽&#xff0c;把生活打理好 只能说快速过了一遍&#xff0c;花了一个多星期吧&#xff0c;然后后边的内容是一点也看不懂了&#xff08;能发现前面记得比较详细&#xff0c;到了后边是看不懂一点了&a…

音视频基础知识分享

音视频基础知识分享 RKMedia的各个组件及其交互 首先上图&#xff1a; 考虑到公司业务主要是相机&#xff0c;所以&#xff0c;主要去关注图像数据流&#xff0c;对于音频数据流直接忽略。 图像数据流向&#xff1a; Camera Sensor将光信号转换成电信号&#xff08;Raw数据&…

基于语音识别的停车共享小程序(lw+演示+源码+运行)

目 录 1 绪论1 1.1 课题研究背景1 1.2 研究现状1 1.3 论文结构安排1 2 系统关键技术2 2.1 微信小程序2 2.2 微信Web开发者工具2 2.3 JavaScript简介2 2.4 微信小程序API接口2 2.5 MYSQL数据库2 3 系统分析1 3.1 可行性分析1 3.1.1 技术可行性1 3.1.2 经济可行性1…

如何查看公众号真实粉丝数,2024年还有哪些粉丝百万以上的大号?

如何查看公众号真实粉丝数&#xff1f;很简单&#xff0c;写了个脚本一键获取&#xff0c;看看2024年还有哪些粉丝百万以上的大号&#xff1f; 猫笔刀这个号2018-2024年的所有历史文章&#xff0c;共1168篇&#xff0c;导出的excel文章数据包含文章日期&#xff0c;文章标题&a…

bean的实例化2024年10月17日

跟不上为基础 1.你的java学习路线 2. 3.课程 注解的装配 contoller调用service用的是注解装配

【Linux】解答:为什么创建目录文件,硬链接数是2;创建普通文件时,硬链接数是1?(超详细图文)

前言 大家好吖&#xff0c;欢迎来到 YY 滴Linux系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Lin…

我在自动化测试方面犯过的3个大错误

每个人都会犯错误&#xff0c;但不管错误看起来有多糟糕&#xff0c;你都可以恢复过来&#xff0c;更重要的是&#xff0c;从错误中学习。 在软件开发过程的任何领域&#xff0c;从编码到测试&#xff0c;我们都会时不时地犯一些错误。通常&#xff0c;这些错误都很小&#xf…

从零开始学PHP之安装开发环境

前言 不整那些虚的&#xff0c;直接开始上干货&#xff0c;争取让小白也看得懂 环境选择 php开发环境一般分为集成环境和编译环境&#xff0c;由于编辑环境费时费力&#xff08;我没搞明白&#xff09;直接使用集成环境&#xff0c;市面上php的集成环境很多我这里用的是phps…

Java—类和对象习题讲解

如果您觉得这篇文章对您有帮助的话 欢迎您一键三连&#xff0c;小编尽全力做到更好 欢迎您分享给更多人哦 目录 习题一&#xff1a; 习题二&#xff1a; 习题三&#xff1a;.import static 能够导入一些静态方法 习题四&#xff1a; 习题五&#xff1a; 习题六&#xff1…

IDEA如何用maven打包(界面和命令两种方式)

前言 我们在使用IDEA开发时&#xff0c;如果是springboot项目的话&#xff0c;一般是用maven来管理我们的依赖的。然后&#xff0c;当我们开发完成之后&#xff0c;就需要打包部署了。 那么&#xff0c;我们应该如何打包呢&#xff1f; 如何打包&#xff08;jar包&#xff09…

智慧医疗,为健康护航

智能医院是一种利用先进的信息技术和智能设备&#xff0c;在提升医疗管理、服务水平和病人体验方面进行改造的现代化医疗机构。智能医院注重集成运维、智能照明和安全调度等关键方面&#xff0c;在医院运营和服务方面提供全方位的支持和保障。 集成运维是智慧医院的基石&#x…

C++初阶——入门

目录 1、C发展历史 2、C版本更新 3、C参考文档 4、C书籍推荐 5、C的程序 6、命名空间 6.1 namespace的作用 6.2 namespace的定义 6.3 namespace的使用 7、C输入&输出 8、缺省参数 9、函数重载 10、引用 10.1 引用的概念和定义 10.2 引用的特性 10.3 引用的使…

【网络原理】TCP/IP五层网络模型之网络层-----IP协议详解,建议收藏!!

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;计算机网络那些事 前几篇文章中我们深入研究了TCP协议&#xff0c;因为TCP协议在我们日常开发中的使用频率非常高。而相比之下&#xff0c;IP协议与我们普通程序员关系就没那么近了。一般是专门开发…

通过Regional Prompter(区域提示词)控制图片精准生成

你是否遇到过想在一张图片的左上角绘制一个太阳&#xff0c;右上角绘制一些云朵&#xff0c;在下方在绘制其他的…&#xff0c;常规方式通过提示词&#xff0c;我们会发现图像大多情况不受我们控制&#xff0c;不会一定按我们的方式去绘制成功。 今天给大家介绍一个插件&#…