C++STL-string类的实现(下)

news2025/7/20 9:26:25

文章目录

  • 1. 流插入和流提取
    • 1.1 流插入
    • 1.2 流提取
  • 2. 现代写法的拷贝构造和赋值函数
    • 2.1 现代写法的拷贝构造
    • 2.1 现代写法的赋值函数
  • 3. string类的迭代器实现
    • 3.1 正向迭代器

1. 流插入和流提取

1.1 流插入

在这里插入图片描述
可能有的同学会这样去写:以一个字符串形式来输出。还有的人会这样写:
在这里插入图片描述
用一个一个字符来输出。这两种有什么区别呢?我们首先来看第一种方式:
在这里插入图片描述
从这里来看,我们没有感觉到什么问题。我们再给它添加几个’\0’来看:
在这里插入图片描述
它是这样的一个输出方式。那么我们再来看第二种输出是什么样子的:
在这里插入图片描述
我们可以看到,它能把最后一个字符’#‘打印出来。而第一种不行。原因就是第一种是按字符串来打印,遇到’\0’结束。第二种是一个一个字符来打印,所以可以打印出字符’#‘。’\0’看不见是因为它是不可见字符。所以,我们第二种写法是比较规范的。

1.2 流提取

在这里插入图片描述
这个大致思路就是:从缓冲区中一个一个字符提取,如果字符不等于空格或换行,就把字符加到对象中。
在这里插入图片描述
但此时,你会看到我们的程序,当我们输入空格或换行都结束不掉。
原因如下:
在这里插入图片描述
从这里,我们可以看出cin在输入空格或换行时,它会认为这个是跟下一个字符的间隔,它就会忽略这些符号,然后等你输入下一个字符的内容。cin没接收到数据是阻塞的,当所有变量接收到数据就执行结束了。

所以像上面的s对象,会忽略空格和换行。所以,你就会不断输入字符,然后s就会不断扩容,插入到s里面,而ch就会取不到空格或换行。

我们可以用在istream里面的get函数:
在这里插入图片描述
这个函数的作用是:
在这里插入图片描述
在这里插入图片描述
这样,我们就可以了。
在这里插入图片描述
这里还有个问题:
在这里插入图片描述
从这里我们可以看到:如果一开始已经有了字符串,我们输入的字符串是在后面接着的。但是在标准库里不是这样的。
在这里插入图片描述
它会把里面的数据清楚,重新输入。所以,我们也最好在一开始清除一下。
在这里插入图片描述
在这里插入图片描述
但是,这样写效率太低了。因为字符的插入,要不断的去开辟空间。
我们可以用这种方式去写:
在这里插入图片描述
这个方式就是创建一个数组,我们先将字符一个一个放到数组里,然后当数组满了的时候,我们将数组里的数据加到字符串里,然后再把数组里的数据置为0,再次赋值判断,如果没有达到最大值就结束了,那么我们也直接加上就行了,这样我们就不需要一开始频繁扩容。

2. 现代写法的拷贝构造和赋值函数

2.1 现代写法的拷贝构造

在这里插入图片描述
我们将s作为s1的别名,用s1的_str来构造一个新的string对象tmp,这样tmp和s1是一样的。然后将tmp的空间和s2的空间进行交换,这样s2和s1就一样了。
但这里,还是存在一些问题:就是tmp是一个局部对象,出了函数tmp会销毁,就会去调用析构函数。在vs2019里,编译器会帮我们的s2对象处理成空。
在这里插入图片描述
但在vs2013不会处理,里面的内容是随机值,而随机值在析构时就会发生错误了。所以,我们最好在初始化列表提前处理一下:
在这里插入图片描述
这样,不论什么编译器析构时都不会发生错误了。
这里,我们可以再简洁一点:
在这里插入图片描述

2.1 现代写法的赋值函数

在这里插入图片描述

这里比拷贝构造还残忍,拷贝构造哪里,tmp和s2交换后,tmp是空。而这里,tmp和s2交换后,tmp里面是s2的值,还要拿去析构。
我们还有一种写法:
在这里插入图片描述
我们传参时就把s1拷贝一份s,然后直接交换。结束时,s会销毁。

3. string类的迭代器实现

3.1 正向迭代器

在string类里面,迭代器就是char*指针。它只是被typedef成了iterator,本质还是指针。但要注意:不是所有的迭代器都是指针,这个我们后面再说。
那么,string类的迭代器是如何实现的呢?我们来看:
在这里插入图片描述
在这里插入图片描述
我们可以看到,这个正向迭代器可以使用。但这里还有一个问题:
在这里插入图片描述
这里和在operator[]函数是同一个道理,const修饰的对象不能传给普通的函数,而是要传给const修饰的函数。
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

《CTFshow - Web入门》03. Web 21~30

Web 21~30web21知识点题解web22知识点题解web23知识点题解web24知识点题解web25知识点题解web26知识点题解web27知识点题解web28知识点题解web29知识点题解web30知识点题解web21 知识点 tomcat 认证爆破burpsuite暴力破解(Sniper)之custom iterator使用…

用Numba:一行代码将Python程序运行速度提升100倍

用Numba:一行代码将Python程序运行速度提升100倍 在《用PyPy加速Python程序》中我们看到,PyPy通过JIT技术可以将Python的运行速度平均提高3-4倍。但即便是提升后,Python的执行速度依然无法与C/C/Rust同日而语。并且PyPy对Python程序的优化对…

【计算机毕业设计】33.快递取件预约系统源码

一、系统截图(需要演示视频可以私聊 摘 要 本论文主要论述了如何使用JSP技术开发一个快递取件预约系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论…

GEO振弦式钢筋计适用范围

适用范围 钢筋计:用于监测岩土工程混凝土建筑物的应力,适用于长期埋设在水工建筑物或其他建 筑物内部,测量结构物内部的钢筋应力。 锚杆应力计:钢筋计用于测量锚杆应力时,成为锚杆应力计。装上锚杆应力计的锚杆称…

Flink部署之Yarn

Flink部署之Yarn 一、环境准备 1、Flink 是一个分布式的流处理框架,所以实际应用一般都需要搭建集群环境。 需要准备 3 台 Linux 机器。具体要求如下: 系统环境为 CentOS 7.5 版本。安装 Java 8。安装 Hadoop 集群,Hadoop 建议选择 Hadoop…

ORB-SLAM2 ---- Tracking::TrackReferenceKeyFrame函数

目录 1.函数作用 2.步骤 3.code 4.函数解析 4.1 将当前帧的描述子转化为BoW向量 4.2 总体解释 1.函数作用 用参考关键帧的地图点来对当前普通帧进行跟踪。 2.步骤 Step 1:将当前普通帧的描述子转化为BoW向量 Step 2:通过词袋BoW加速当前帧与参考帧…

PG::Covfefe

nmap -Pn -p- -T4 --min-rate1000 192.168.205.10 nmap -Pn -p 22,80,31337 -sCV 192.168.205.10 先查看31337端口的robots.txt目录,几个隐藏文件未发现可利用的地方 dirb对31337路径的枚举中发现了.ssh 访问后发现存在私钥 下载id_rsa和id_rsa.pub 得知用户名为…

Vscode-Git graph怎么看?

VScode可以使用插件查看git提交图谱,这个图谱看起来眼花缭乱,今天花时间看懂了,在这里分享一下。 在Vscode插件中搜索git graph安装 打开git项目,在左下角可以看到git graph 在右侧可以看到按照时间分布的commit,代表…

Java JSP JAVAweb在线考试系统源码网上考试系统源码(ssm考试管理系统)

JSP在线考试系统源码网上考试系统源码(ssm考试管理系统)

PLC中ST编程的IF判断

如果判断条件是如果...否则...的时候; 如果wData的值是16进制的FFFF,十进制的65535;就执行IF中的语句,否则就执行ELSE中的; 当wData的值为0时,因不符合IF的判断条件,执行了ELSE中的语句&#x…

MySQL索引底层数据结构

索引简介 索引是一个排好序的数据结构,包含着对数据表里所有记录的引用指针,如下图所示。索引文件和数据文件一样都存储在磁盘中,数据库索引的目的是在检索数据库时,减少磁盘读取次数。 常见的索引数据结构包括二叉树、红黑树、…

node多版本控制

今天遇到一个问题: 下载了一个vue项目,一直卡在npm install阶段,折腾了半天,发现是版本太高了,需要降低一下版本,但是其他项目需要高版本的,这不就冲突了; 找到了一个node多版本控制…

基于SSM的亲子活动平台的搭建与实现(源码+数据脚本+论文+技术文档)

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

葡萄糖-聚乙二醇-刀豆球蛋白A,ConcanavalinA-PEG-Glucose

葡萄糖-聚乙二醇-刀豆球蛋白A,ConcanavalinA-PEG-Glucose 中文名称:葡萄糖-刀豆球蛋白A 英文名称:Glucose-ConcanavalinA 别称:刀豆球蛋白A修饰葡萄糖,ConA-葡萄糖 存储条件:-20C,避光&…

数据结构复习题

数据结构课程复习纲要 核心知识点 从数据结构的逻辑结构、存储结构和数据的运算三个方面去掌握线性表、栈、队列、串、数据、广义表、数和图等常用的数据结构。掌握在各种常用的数据结构上实现的排序和查找运算。对算法的时间和空间复杂度有一定的分析能力。针对简单的应用问…

Python:每日一题之四平方和

题目描述 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多 4 个正整数的平方和。 如果把 0 包括进去,就正好可以表示为 4 个数的平方和。 比如: 5 0^2 0^2 1^2 2^2; 7 1^2 1^2 1^2 2^2&am…

CF385D Bear and Floodlight

题意简述(翻译) 在平面直角坐标系上,沿直线从 (l,0)(l,0)(l,0) 走到 (r,0)(r,0)(r,0) 。有 nnn 盏灯,第 iii 盏灯位于 (xi,yi)(x_i,y_i)(xi​,yi​) ,可以照亮的角度为 aia_iai​ (注意不是弧度制&#xf…

浅尝辄止:数据库--数仓大数据平台--数据中台

很久没有更新博客了,今天主要是想谈一谈自己工作几年总结的心得。 1.浅尝辄止 数据库:基于mysql,oracle来实现数据库分析(存储在数据库,使用数据库语言直接分析,最后成报表形式)。 数仓&大…

rust编程-通用编程概念(chapter 3.2 3.3 数据类型和函数)

目录 2. 数据类型 2.2 复合类型 3. 函数 2. 数据类型 Rust中的所有值都是有特定数据类型的,rust是强类型语言,也是静态类型语言(编译器类型必须确定)。 编译器可以根据值来进行类型推断,但对有歧义的,必…

计算机毕业设计——基于SpringBoot框架的网上购书系统的设计与实现

文章目录前言一、背景及意义选题背景选题目的二、系统设计主要功能运行环境三、系统实现部分页面截图展示部分代码展示四、源码获取前言 提示:这里可以添加本文要记录的大概内容: 二十一世纪是网络化,信息化的时代,为了满足广大…