string类(二)

目录

前言

string类的常用接口说明

3、string类对象的容量操作

3.1 size,length和capacity

3.2 empty和clear

3.3 reserve

3.4 resize

4、string类的修改操作 

4.1 operator+=

4.2 c_str

4.3 find+npos

5、string类非成员函数

5.1 operator>>和operator<<

5.2 getline

5.3 relational operators


前言

这一篇其实是上一篇文章常见接口的续写,量大管饱的宝贝们,哈哈😄😄😄

string类的常用接口说明

3、string类对象的容量操作

3.1 size,length和capacity

  size 和 length 其实底层是一样的,但是 length 是先出现的,他的意思是长度,你表示顺序表还行,但是如果是链表,是不是就不太靠谱了,而size是大小和规模的意思,是不是用在什么上面都合理了,所以现在都不在用length了,我们现在用的更多的是size。

  size就是返回字符串的长度,而capacity则是返回容量的大小,string类当你开辟一个字符串对象以后,编译器为你分配的空间大小并不是你字符串的大小,好多编译器开始都是直接分配16个字节的大小,如果不够用,每次扩容1.5倍(取决于编译器,因为C++并没有制定严格的标准,Linux是1.5倍,但是vs上是第一次2倍,剩余都是1.5倍)。

  那有个问题就是,开始分配的空间capacity得到的大小以及size得到的字符串长度都算不算 \0 呢?我们来验证一下:

  大家可以看到 size得到的字符串长度和capacity得到的容量大小都不包含'\0',所以代价要注意,也就是说capacity实际大小为16个字节。

  但有个问题就是str.size()他的位置也是位于字符串最后一个字符的右侧,也就是但你得到的size为什么不包括 /0 呢,因为size的计算范围是左闭右开的。

3.2 empty和clear

  这两个函数就没什么可讲的的了,empty用于判空,clear用于清空数据(仅限于清空数据,不会释放空间)。

3.3 reserve

下图是C++指南上的此函数的简介:

  大家可能看不懂,我说一下大概意思:他会帮你扩容(扩大capacity)或缩容到你想要的空间大小,如果你往大的空间扩,他是一定会满足你的,而且有可能扩的比你给的还大一点(具体由编译器决定),但是如果你想要缩容,他是不一定的,如果你缩小的容量小于你的字符串长度,那么它将不一定会缩小,但是会保证你的内容不会损坏。如果你要缩小到比字符串还小的空间,在vs平台上它不会是capacity缩小,但是在Linux平台上,它会将容量缩小到你字符串的大小,依旧不会影响你的内容。带大家感受一下vs平台上的reserve函数:

int main()
{string s1("hello world");s1.reserve(1000);cout << s1.size() << endl;cout << s1.capacity() << endl;s1.reserve(5);cout << s1.size() << endl;cout << s1.capacity() << endl;return 0;
}

 

明白了吧,宝子们。 

3.4 resize

 这个函数就是改变字符串的长度,内容如下:

  话不多说,直接说用法,大家看容易看到他有两个使用方式,但大致作用都是一样的,第一个参数是传入一个无符号整型,将字符串大小改变成指定大小,capacity不变,如果使用第一个,将size扩大到大于原来字符串的大小,那么多的部分会被初始化为 '\0' ,如果用第二个,那你可以输入一个字符,多的部分会按照你输入的字符进行初始化。如果将字符串缩小,效果如下:

字符串变长,设置指定字符,效果如下:

如果不设定指定字符,需要借助调试的监视窗口进行观看: 

4、string类的修改操作 

 这个我们就不都讲了,只讲几个重点:

4.1 operator+=

  xdm,不是我吹,这个是真的好用啊,前面我们讲过运算符重载的使用方式,operator += 使用以后就直接把你想要增加的字符串尾插到原来的字符串后面了,用法如下:

string s2("hello ");
s2.operator+=("world");
cout << s2 << endl;

  xdm可能会说好像用着没那么爽,但是我之前类与对象讲过,运算符重载可以直接当运算符使用,那么就可以变成这样:

string s2("hello ");
s2 += "world";
cout << s2 << endl;

  这样用着是不是就爽多了,哈哈哈哈,结果如下:

4.2 c_str

先来看一下该函数的介绍:

  c_str 其实就是把string类转变为字符串,比如以下例子:

  很明显,上述例子出现了错误,fopen函数由于是C语言里的函数,所以第一个参数你就不可能传一个string类的对象,而必须传一个字符串,创造出 c_str 函数的目的就是为了让C++兼容C语言,既然 fopen 第一个参数是必须是const char*,那我们就可以使用 c_str 函数将 filename 转换为类内部成员char*,当然,c_str 的返回值也是const char*。

4.3 find+npos

  先来讲一下什么是npos,他其实是string类里的一个静态成员变量,它的定义是size_t npos = -1;size_t是无符号整型,所以实际npos实际表示无符号整型最大值

下面附上find介绍:

 这个函数我们一般只用第四个,也就是 size_t find (char c, size_t pos = 0) const;这个就是从 pos 位置开始找 char c 的位置,返回该字符位于 pos 后的第几个位置。那为什么把它和 npos 放到一块呢,是因为他如果没找到你要的字符,那么它的返回值就是 npos ,所以两个东西一般联合使用,比如下边的例子,将空格替换为 ”%%“:

string str("hello world hello everyone");
size_t pos = str.find(' ');
while (pos != string::npos)
{str.replace(pos, 1, "%%");pos = str.find(' ');
}
cout << str << endl;

可以得到结果:

 

5、string类非成员函数

  以下要讲的是string类非成员函数,为什么叫string类非成员函数呢,其实是因为他们并没有定义在类内,大家都知道,运算符重载参数个数是有限制的,那么以operator>>为例,第一个参数就只能是 this 指针,让人看着很别扭,而getline这种函数又不止对string类有作用,所以规定为全局函数。

5.1 operator>>和operator<<

  operator>>和operator<<我们就不再过多讲解了,我给大家附上一张我之前实现的Date类operator<<的代码,大家看一下就懂了:

  这里面的 ostream 其实是 cout 的类型,所以只需要传 cout 就可以了,同样的,重载>>时传 cin,类型为 istream 。

5.2 getline

看看getline的介绍:

 

  这个函数有什么用呢,如果大家输入一个带空格的字符串,而编译器默认两个字符串使用空格和回车分割的,所以编译器会认为这是两个字符串,如下情况:

  所以我们就要考虑如何能直接输入一串附带空格和换行的字符,这时,getline就派上用场了,他能从输入流中提取一串字符直到遇到你设定的char delim为止(如果你没设置delim,则默认只提取一行),这里的参数 istream 和上面一样,传 cin 就可以

如果没设置截止字符,则只会提取到一行代码,也就是 hello world,如下: 

5.3 relational operators

  这个不用讲了,其实就是函数重载大家族,并且都没有在类内进行重载,直接看都有哪些就可以了,基本所有重载都很简单:

ok,string类(二)到此为止了,下一节我们来简单实现string类,拜拜兄弟们!! 

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

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

相关文章

医疗影响分割 | 使用 Swin UNETR 训练自己的数据集(3D医疗影像分割教程)

<Swin UNETR: Swin Transformers for Semantic Segmentation of Brain Tumors in MRI Images> 代码地址:unetr 论文地址:https://arxiv.org/pdf/2201.01266 一、下载代码 在Github上下载代码,然后进入SWINUNETR,前两个是针对两个数据集(BRATS21、BTCV)的操作,这里…

在CAD中插入图块后为什么看不到?怎么解决?

按照正确操作插入图块&#xff0c;但图纸上不显示新插入的图块&#xff0c;这是为什么&#xff1f; 原因可能是大家插入的图块太小&#xff0c;导致看不到&#xff0c;显示成一个点&#xff0c;所以大家插入图块的时候记得根据图纸大小&#xff0c;将比例改大一些就可以啦✌️…

【CMAEL多智能体框架】第一节 环境搭建及简单应用(构建一个鲜花选购智能体)

第一节 环境搭建 文章目录 第一节 环境搭建前言一、安装二、获取API1. 使用熟悉的API代理平台2.设置不使用明文存放API 三 、具体应用进阶任务 总结 前言 CAMEL Multi-Agent是一个开源的、灵活的框架&#xff0c;它提供了一套完整的工具和库&#xff0c;用于构建和模拟多智能体…

Flink-序列化

一、概述 几乎每个Flink作业都必须在其运算符之间交换数据&#xff0c;由于这些记录不仅可以发送到同一JVM中的另一个实例&#xff0c;还可以发送到单独的进程&#xff0c;因此需要先将记录序列化为字节。类似地&#xff0c;Flink的堆外状态后端基于本地嵌入式RocksDB实例&…

使用DeepSeek和Kimi快速自动生成PPT

目录 步骤1&#xff1a;在DeepSeek中生成要制作的PPT主要大纲内容。 &#xff08;1&#xff09;在DeepSeek网页端生成 &#xff08;2&#xff09;在本地部署DeepSeek后&#xff0c;使用chatBox生成PPT内容 步骤2&#xff1a;将DeepSeek成的PPT内容复制到Kimi中 步骤3&…

第41天:Web开发-JS应用微信小程序源码架构编译预览逆向调试嵌套资产代码审计

#知识点 1、安全开发-微信小程序-搭建&开发&架构&安全 2、安全开发-微信小程序-编译调试&反编译&泄露 一、小程序创建&#xff08;了解即可&#xff09; 1、下载微信开发者工具 2、创建小程序模版引用 https://developers.weixin.qq.com/miniprogram/dev/d…

Arduino 第十一章:温度传感器

Arduino 第十一章&#xff1a;LM35 温度传感器 一、LM35 简介 LM35 是美国国家半导体公司&#xff08;现德州仪器&#xff09;生产的一款精密集成电路温度传感器。与基于热力学原理的传统温度传感器不同&#xff0c;LM35 能直接将温度转换为电压输出&#xff0c;且输出电压与…

Oracle常用导元数据方法

1 说明 前两天领导发邮件要求导出O库一批表和索引的ddl语句做国产化测试&#xff0c;涉及6个系统&#xff0c;6千多张表&#xff0c;还好涉及的用户并不多&#xff0c;要不然很麻烦。 如此大费周折原因&#xff0c;是某国产库无法做元数据迁移。。。额&#xff0c;只能我手动导…

2022java面试总结,1000道(集合+JVM+并发编程+Spring+Mybatis)的Java高频面试题

1、面试题模块汇总 面试题包括以下十九个模块&#xff1a; Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql、Redis、JVM 。如下图所示…

Curser2_解除机器码限制

# Curser1_无限白嫖试用次数 文末有所需工具下载地址 Cursor Device ID Changer 一个用于修改 Cursor 编辑器设备 ID 的跨平台工具集。当遇到设备 ID 锁定问题时&#xff0c;可用于重置设备标识。 功能特性 ✨ 支持 Windows 和 macOS 系统&#x1f504; 自动生成符合格式的…

carbon 加入 GitCode:Golang 时间处理的 “瑞士军刀”

在 Golang 的开发生态中&#xff0c;时间处理领域长期存在着诸多挑战。高效、精准的时间处理对于各类软件应用的稳定运行与功能拓展至关重要。近日&#xff0c;carbon 正式加入 GitCode&#xff0c;为 Golang 开发者带来一款强大且便捷的时间处理利器&#xff0c;助力项目开发迈…

算法学习--链表

引言&#xff1a;为什么进行链表的学习&#xff1f; 考察能力独特&#xff1a;链表能很好地考察应聘者对指针操作、内存管理的理解和运用能力&#xff0c;还能检验代码的鲁棒性&#xff0c;比如处理链表的插入、删除操作时对边界条件的处理。数据结构基础&#xff1a;链表是很多…

域名劫持原理与实践

了解域名及域名劫持 由于点分十进制的IP地址难于记忆&#xff0c;便出现了域名。由于网络传输中最终还是基于IP&#xff0c;所以必须通过一种机制将IP和域名一一对应起来&#xff0c;这便是DNS。全球总共有13台根域名服务器。 域名劫持是互联网攻击中常见的一种攻击方式&…

【论文翻译】DeepSeek-V3论文翻译——DeepSeek-V3 Technical Report——第二部分:(训练硬件)基础设施

论文原文链接&#xff1a;DeepSeek-V3/DeepSeek_V3.pdf at main deepseek-ai/DeepSeek-V3 GitHub 特别声明&#xff0c;本文不做任何商业用途&#xff0c;仅作为个人学习相关论文的翻译记录。本文对原文内容直译&#xff0c;一切以论文原文内容为准&#xff0c;对原文作者表示…

MapReduce到底是个啥?

在聊 MapReduce 之前不妨先看个例子&#xff1a;假设某短视频平台日活用户大约在7000万左右&#xff0c;若平均每一个用户产生3条行为日志&#xff1a;点赞、转发、收藏&#xff1b;这样就是两亿条行为日志&#xff0c;再假设每条日志大小为100个字节&#xff0c;那么一天就会产…

Error: llama runner process has terminated: exit status 0xc0000409 问题解决办法

在大模型部署过程中&#xff0c;格式转换环节若使用了高版本的 llama.cpp 库&#xff0c;而系统当前运行的版本较低&#xff0c;就会出现版本不兼容的情况。 这种不匹配会阻碍模型的正常运行&#xff0c;进而导致报错。建议你密切关注模型所需的版本要求&#xff0c;及时将系统…

代码随想录-训练营-day20

今天我们继续回溯&#xff1a; 39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 这个题和我们之前的组合题相比&#xff0c;最大的区别在于我们可以无限次的重复取用某值了&#xff0c;这就让我们的递归参数与之前不同&#xff0c;除此之外&#xff0c;本质上这个题与21…

ubuntu 本地部署deepseek r1 蒸馏模型

本文中的文件路径或网络代理需要根据自身环境自行删改 一、交互式chat页面 1.1 open-webui 交互窗口部署&#xff1a;基于docker安装&#xff0c;且支持联网搜索 Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台&#xff0c;旨在完全离线操作。它支持各种 LLM…

数据库 绪论

目录 数据库基本概念 一.基本概念 1.信息 2.数据 3.数据库&#xff08;DB&#xff09; 4.数据库管理系统&#xff08;DBMS&#xff09; 5.数据库系统&#xff08;DBS&#xff09; 二.数据管理技术的发展 1.人工管理阶段 2.文件系统阶段 3.数据库系统阶段 4.数据库管…

数据中台是什么?:架构演进、业务整合、方向演进

文章目录 1. 引言2. 数据中台的概念与沿革2.1 概念定义2.2 历史沿革 3. 数据中台的架构组成与关键技术要素解析3.1 架构组成3.2 关键技术要素 4. 数据中台与其他平台的对比详细解析 5. 综合案例&#xff1a;金融行业数据中台落地实践5.1 背景5.2 解决方案5.3 成果与价值 6. 方向…