string类(3)

news2024/12/28 8:41:06

string类(3)

在这里插入图片描述

push_back

这是尾插一个字符。

append

这是尾插字符串。可以看出来设计得很复杂。

实践中比较常用的是:

string s("hello world");
s.push_back(' ');
s.push_back('x');
s.append("zzzzzzzz");

用得更多的是:

operator +=

实践中,string的尾插我们用+=就可以了。底层空间不够了会扩容。

assign

赋值,把之前的覆盖掉。空间不够底层也会扩容。

和operator=有一些重叠。

用得也比较少。

insert

这个接口设计也比较冗余。很多接口的实用性并没有那么强。

真正用得多的就两个:

可以看到没有提供头插。所以头插就得用insert。

但是头插或者中间插入要谨慎,因为实现效率比较低。一个是空间不够要扩容,另一个是需要把插入位置之后的数据整体后移

也可以只插入一个字符,只要用的是双引号不是单引号就行。

或者这样写(体现出混乱):

这个是先创建char对象,然后再插入,有两种方式:第一种不得不写第二个参数为1;第二种前一个是迭代器。

insert要谨慎使用,不到万不得已不要轻易用。

向前兼容,所以冗余。

erase

第一个用得最多。

还可以这样尾删:

还可以 这样尾删:

string s("hello world");
s.erase(s.size()-1,1);
cout << s << endl;

总结:

//头删
s.erase(0,1);
s.erase(s.begin());
//尾删
s.erase(--s.end());
s.erase(s.size()-1,1);

sequence (1):
string& erase (size_t pos = 0, size_t len = npos);

所以可以利用npos,全删了:

s.erase(6);

string一般只尾插,不删除,不在中间插入。可以用不同的策略提高效率。

replace

可以替换成string、string的一部分,char*、char *的一部分;可以从一个迭代器到另一个迭代器间替换,也可以从pos开始的len个字符替换。

底层是怎么做的呢?应该字符替换成两个字符,得向后挪动,空间不够还得扩容。如果是多个字符替换成更少的字符,不需要扩容但是要往前挪动数据。

这东西效率也不高。

怎么把所有的空格替换成百分号呢?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是每次都是从头到尾找空格,没必要。

character (4)
size_t find (char c, size_t pos = 0) const;

while (pos != string::npos)
{
	s.replace(pos,1, "%%");
	pos = s.find( ' ',pos+2);//pos+2
}

但是如果要大量这样字符串替换,这个代码是非常不好的。因为不止一次扩容。

这时候我们就可以考虑用空间换时间。

最后可以复制拷贝:

s=tmp;

其实用swap会更高效:

s.swap(tmp);

这个交换在底层会把它俩的_str,_size,_capacity进行交换:

class string
{
    char* _str;
    size_t _size;
    size_t _capacity;
};

这个效率很高,如果我们再reserve一下,效率就更高了 :

string tmp;
tmo.reserve(s.size());
for(auto ch : s)
{
    ……
}

所以insert erase replace都要警惕其成为性能杀手。replace只在平替效率高。

关于尾删,C++11还提供了个pop_back,但是用erase尾删也可以。

c_str

功能就是返回它底层那个指向堆上空间的字符串指针。

意义是什么呢?兼容C语言。

功能就是return一个C形式的字符串。

适用于一些需要C的接口:

string file;
cin >> file;
FILE* fout = fopen(file.c_str(), "r");
char ch = fgetc(fout);
while(ch!= EOF)
{
    cout<<ch;
    ch=fgetc(fout);
}
fclose(fout);

data接口和c_str类似。

get_allocator先不用管。

copy就是拷贝一个子串过来,用得少。

find系列

我们前面已经看过find,可以找字符或者串。

rfind是倒着找。什么情况需要倒着找?比如想要获取一个文件的后缀。

但如果我们的s是"test.cpp.zip",我们只能取到cpp.zip,但我们想要的是zip。

所以我们用rfind比较合理。

find_first_of

和"abcd"中的任意一个相等就返回,替换为’*'。

所以这个接口名字比较不符合功能。

find_last_of

倒着找

find__first_not_of


然后来看看string的几个非成员函数

operator+

为什么这个+要设计成非成员函数?

因为它想要支持把string+字符串反过来,也就是字符串+string:

不过,这个+用得不是很多。

relational operators (string)


这个不多说了。

本文到此结束=_=

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PHP移动端商城程序多端支付全端分享系统小程序源码

&#x1f4f1;&#x1f4b0;「移动端商城多端支付全端分享系统」——打造无缝购物新体验&#xff01;&#x1f6cd;️✨ &#x1f680; 开篇&#xff1a;一键触达&#xff0c;购物无界&#xff01; 在这个快节奏的时代&#xff0c;购物也需要跟上步伐&#xff01;&#x1f3c…

PY信号和槽

知不足而奋进 望远山而前行 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 在使用PyQt进行图形用户界面&#xff08;GU…

【网络】数据链路层-MAC帧

数据链路层-以太网与ARP协议 文章目录 1.数据链路层2.以太网2.1什么是以太网2.2MAC帧格式 3.ARP协议3.1为什么有ARP协议&#xff1f;3.2ARP的定位3.3ARP协议工作流程3.4ARP数据格式 4.RARP协议 1.数据链路层 数据链路层是网络协议栈中最底层的内容&#xff0c;而在之前对其他…

重装系统前如何备份数据?让重装无后顾之忧

在日常使用电脑的过程中&#xff0c;有时我们可能需要重装系统以解决一些难以通过常规手段解决的问题。然而&#xff0c;在重装系统之前&#xff0c;最重要的一步就是备份数据&#xff0c;以防止重要信息的丢失。本文将详细介绍如何在重装系统前进行数据备份&#xff0c;确保您…

Neo4j + LangChain:如何构建基于知识图谱的最强RAG系统?

自从 Neo4j 宣布与 LangChain 的集成以来&#xff0c;我们已经看到许多围绕使用 Neo4j 和大语言模型&#xff08;LLM&#xff09;构建检索增强生成&#xff08;RAG&#xff09;系统的用例。这导致了近年来知识图谱在 RAG 中使用的快速增加。基于知识图谱的 RAG 系统在处理幻觉方…

找搭子的社交软件有哪些?国内靠谱找搭子APP排行榜前10名推荐!

咕哇小程序&#xff1a;这是一个实名制的找搭子交友平台&#xff0c;没错是实名制的&#xff0c;所以骗子会少很多&#xff0c;比较纯粹&#xff0c;是我用得最久且一直在用的找搭子平台。在这个平台上&#xff0c;可以轻松找到兴趣相投的各类搭子&#xff0c;无论是旅行搭子、…

html+css+js网页设计 程序员个人编程学习网站15个页面

htmlcssjs网页设计 程序员个人编程学习网站15个页面 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源…

【原创教程】电气制图01:启航EPLAN电气设计

从这篇文章开始,我们将阐述在实际电气制图的过程中,遇到的问题,以及我们应有的思路,从而能够胜任电气设计工作。 我们在接到电气图纸设计的项目时,前期的有效沟通是很关键的,他直接影响到你图纸设计的准确度。 首先,我们需要了解项目的规模、客户的工艺需求、‌预算和…

Meta祭出三篇最详尽Llama微调指南!千字长文,0基础小白必备

如何使用特定领域数据微调LLM&#xff0c;如何确定微调适配自己的用例&#xff0c;以及如何管理良好训练数据集的经验法则。 接下来&#xff0c;直接进入正题。 针对所有自学遇到困难的同学们&#xff0c;我帮大家系统梳理大模型学习脉络&#xff0c;将这份 LLM大模型资料 分享…

蓝牙信令测试(二)

本文BLE测试主要依据RF-PHY.TS.5.0.0协议,且仅包含了NOC(正常工作条件)的不需添加干扰的测试项目。EOC(极限工作条件)需要根据实际情况(温度范围、湿度范围以及电源类型等)而定,干扰信号需要信号发生器,在这里不再展开。 BLE支持三个物理层,如下图: 其中S=2代表2个…

pyro 教程和实例 支持贝叶斯神经网络实现 (pyro 1.8以上的)bnn Bayesian Neural Network pyro ,人工智能

Example: Bayesian Neural Network — NumPyro documentation https://uvadlc-notebooks.readthedocs.io/en/latest/tutorial_notebooks/DL2/Bayesian_Neural_Networks/dl2_bnn_tut1_students_with_answers.html 注意&#xff0c;这些文档&#xff0c;也是有对应的版本的&…

记一次 .NET某实验室自动进样系统 崩溃分析

一&#xff1a;背景 1. 讲故事 前些天有位朋友在微信上联系到我&#xff0c;说他们的程序在客户那边崩掉了&#xff0c;让我帮忙看下怎么回事&#xff0c;dump也拿到了&#xff0c;那就上手分析吧。 二&#xff1a;WinDbg 分析 1. 哪里的崩溃 既然是程序的崩溃&#xff0c…

《黑神话:悟空》中的黑科技及未来高端游戏展望

一、《黑神话&#xff1a;悟空》中的黑科技 1. 虚幻引擎5与次世代渲染技术 《黑神话&#xff1a;悟空》是首批采用虚幻引擎5&#xff08;Unreal Engine 5&#xff09;的游戏之一&#xff0c;虚幻引擎5代表了当前游戏引擎技术的顶尖水平。其核心技术“Nanite”和“Lumen”分别…

【学术英语】Unit3:Academic Writing(学术写作)

文章目录 一、摘要1.1 摘要简介1.2 摘要的两种类型1.3 写摘要的技巧1.4 摘要的关键词1.5 例子1.5.1 例子11.5.2 例子2 二、注释和致谢2.1 注释的格式2.1.1 Book2.1.2 论文2.1.3 例子 2.2 致谢的格式 三、书目选编 一、摘要 1.1 摘要简介 摘要对学术写作极其重要和有用&#x…

健康管理小程序怎么做 健康管理小程序系统开发制作方法

很多老板想要做一个自己公司的健康管理小程序&#xff0c;但是不知道该怎么做&#xff0c;本次瀚林就为大家详细介绍一下各种中心小程序系统的开发制作方法为大家做参考。 目前市面上的健康管理有很多类型例如常见的健康管理中心、健康服务平台、健康生活馆、健康科技管家、健康…

mysql定位慢查询和分析

1. 使用工具&#xff1f; 运维工具&#xff1a;skywalking&#xff0c;可以监测出哪个接口&#xff0c;然后找到对应的sql。2. 在调试阶段使用mysql配置&#xff1f; 确保慢查询日志功能已经开启。设置慢查询阈值&#xff08;可选&#xff09;。分析慢查询日志。 在调试阶段中…

不使用 JS 纯 CSS 获取屏幕宽高

在现代前端开发中&#xff0c;获取屏幕的宽度和高度通常依赖于 JavaScript。然而现代 CSS 也可以获取到屏幕的宽高&#xff0c;通过自定义属性&#xff08;CSS Variables&#xff09;和一些数学函数来实现这一目标。本文将详细解析如何使用 CSS 的 property 规则和一些数学运算…

ToB福音?专业场景数据生成的“大杀器”接连发布

Meta官方发布的LLaMA3.1-405B的各项得分 ©作者|格林 来源|神州问学 最近&#xff0c;AI领域掀起了一股数据合成的热潮&#xff0c;各大厂商最近推出的模型都或多或少有数据合成的影子。英伟达的Nemotron-4-340B-Instruct、微软的Orca-3&#xff0c;以及Meta的Meta-Llama…

三维尺寸公差分析软件哪个最好用?推荐上海棣拓自研软件DTAS

软件简介 国产自研-3D公差分析软件 DTAS 3D (Dimensional Tolerance Analysis System 3D)基于蒙特卡洛原理&#xff0c;按照产品的公差及装配关系进行建模&#xff0c;然后进行解析、仿真计算&#xff0c;最终预测产品设计是否能够满足其关键尺寸要求&#xff0c;同时预测产品…

【Linux操作系统】进程间通信(2)——共享内存

目录 一、共享内存 一、共享内存 共享内存的原理&#xff1a; 进程A把它的数据在地址空间中通过页表映射到物理内存中&#xff0c;进程B通过页表获取物理内存的物理地址&#xff0c;得到数据。 共享内存在物理内存可能有多个&#xff0c;那么两个进程如何确定找到的是同一个共…