模拟实现string类: clear函数、流提取(<<)和流插入(>>)运算符重载、>、<、==、<=、>=、!=的运算符重载、赋值运算符(=)重载等的介绍

文章目录

  • 前言
  • 一、 clear函数
  • 二、流提取(<<)和流插入(>>)运算符重载
  • 三、 >、<、==、<=、>=、!=的运算符重载
  • 四、赋值运算符(=)重载
  • 总结


前言

模拟实现string类: clear函数、流提取(<<)和流插入(>>)运算符重载、>、<、==、<=、>=、!=的运算符重载、赋值运算符(=)重载等的介绍


string类的上半部分:模拟实现string类对象上半部分

一、 clear函数

  • 清除字符串的内容,本质上就是让字符串大小置为0, 将0处的字符置为’\0’

void clear()
{_size = 0;_str[_size] = '\0';
}

二、流提取(<<)和流插入(>>)运算符重载

  • 流提取,就是循环打印每个字符,可以使用【】运算符重载和范围for语法糖
  • 流插入,这里采用临时字符数组的形式:
    1. 首先,先检查并跳过输入字符串之前的空格或换行,然后创建一个128个字节空间的临时字符数组
    1. 然后,不断读取字符,并插入到字符数组中去,当字符数组中存储127个字符后,将最后一个空间置为’\0’
    1. 然后,将使用+=运算符重载将字符数组插入到string类中,循环执行,直到字符串结束
    1. 最后,若下标值不为0,将字符数组末置为’\0’,并+=到string类中。

这样做的好处是,可以减少string类开辟空间的次数, 提高性能。

// 流提取
ostream& operator<<(ostream& out, string& s)
{for (auto ch : s){out << ch;}//for (size_t i = 0; i < s.size(); i++)//{//	out << s[i];//}return out;
}// 流插入
istream& operator>>(istream& in, string& s)
{// 检查并跳过输入字符串之前的空格或者换行char ch = in.get();while (ch == ' ' || ch == '\n'){ch = in.get();}char buff[128];int i = 0;while (ch != ' ' && ch != '\n'){buff[i++] = ch;if (i == 127){buff[i] = '\0';s += buff;i = 0;}ch = in.get();}if (i != 0){buff[i] = '\0';s += buff;}return in;
}

测试:

void Test_string7()
{hhb::string s1("hello world");cout << s1 << endl;hhb::string s2;cin >> s2;cout << s2 << endl;
}

在这里插入图片描述

  • 只开辟了两次空间。

三、 >、<、==、<=、>=、!=的运算符重载

  • 可以循环遍历字符串内容,比较每个字符,根据对应规则返回布尔值,若跳出循环,则比较长度,长的字符大
  • 也可以是memcmp函数进行比较,memcmp函数大于返回大于0的值,小于返回小于0的值,等于,返回0。
  • 只用书写< 和 == 的逻辑,其他的可以复用。
// < 运算符重载
// hello      hello  // false
// hello      helloxxx // true
// helloxxx   hello // false
/*bool operator< (string& s) 
{size_t i1 = 0;size_t i2 = 0;while (i1 < _size && i2 < s._size){if (_str[i1] < s._str[i2]){return true;}else if (_str[i1] > s._str[i2]){return false;}else{++i1;++i2;}}if (_size < s._size){return true;}else{return false;}
}*/bool operator< (string& s) const
{int ret = memcmp(_str, s._str, _size > s._size ? _size : s._size);return (ret < 0);
}bool operator== (string& s) const
{return _size == s._size&& memcmp(_str, s._str, _size) == 0;
}bool operator> (string& s) const
{return !(*this < s || *this == s);
}bool operator<= (string& s) const
{return !(*this > s);
}bool operator>= (string& s) const
{return !(*this < s);
}bool operator!= (string& s) const
{return !(*this == s);
}

测试:

void Test_string8()
{hhb::string s1("hello");hhb::string s2("helloxxxx");cout << (s1 < s2) << endl;cout << (s1 > s2) << endl;cout << (s1 != s2) << endl;cout << (s1 == s2) << endl << endl;hhb::string s3("helloxxxx");hhb::string s4("hello");cout << (s3 < s4) << endl;cout << (s3 > s4) << endl;cout << (s3 != s4) << endl;cout << (s3 == s4) << endl << endl;hhb::string s5("hello");hhb::string s6("hello");cout << (s5 < s6) << endl;cout << (s5 > s6) << endl;cout << (s5 != s6) << endl;cout << (s5 == s6) << endl << endl;}

在这里插入图片描述

四、赋值运算符(=)重载

    1. 开辟和s一样空间的大小,进行深拷贝,把字符串内容拷贝到空间中去, 然后释放原来的空间内容,将字符串指向新开辟的空间 ,最后拷贝字符大小和字符串的空间。
    1. 在=运算符重载函数中使用传入的类对象创建临时的类对象,调用std的交换函数,交换临时对象和原来的对象内容。完成赋值,并且当函数结束,临时对象会自动调用析构函数。
    1. 直接传值调用,直接创建临时对象,并与临时对象交换内容。完成赋值。
// =运算符重载
/*string& operator= (const string& s)
{char* tmp = new char[s._capacity + 1];delete[] _str;memcpy(tmp, s._str, s._size);_str = tmp;_size = s._size;_capacity = s._capacity;return *this;}*//*string& operator= (const string& s)
{if (this != &s){string tmp(s);std::swap(_str, tmp._str);std::swap(_size, tmp._size);std::swap(_capacity, tmp._capacity);}return *this;}*/void swap(string& s)
{std::swap(_str, s._str);std::swap(_size, s._size);std::swap(_capacity, s._capacity);
}string& operator= (string tmp)
{swap(tmp);return *this;}

测试:

void Test_string9()
{hhb::string s1("hello world");hhb::string s2("ladys and gentleman");s1 = s2;cout << s1 << endl;
}

在这里插入图片描述


总结

模拟实现string类: clear函数、流提取(<<)和流插入(>>)运算符重载、>、<、==、<=、>=、!=的运算符重载、赋值运算符(=)重载等的介绍

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

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

相关文章

上线跨境电商商城的步骤

上线一个跨境电商商城涉及多个步骤&#xff0c;从前期准备到上线后的维护。以下是一些关键步骤&#xff1a; 1. 市场调研与规划 目标市场分析&#xff1a;研究目标市场的需求、竞争对手和消费者行为。法律法规&#xff1a;了解并遵守目标市场的法律法规&#xff0c;包括税收、…

git学习【持续更新中。。。】

git学习【持续更新中。。。】 文章目录 git学习【持续更新中。。。】一、Git基本操作1.创建本地仓库2.配置本地仓库1.局部配置2.全局配置 3.认识工作区、暂存区、版本库4.添加文件5.修改文件6.版本回退7.撤销修改8.删除文件 二、Git分支管理1.理解分支2.创建、切换、合并分支3.…

YOLOv8改进:SA注意力机制【注意力系列篇】(附详细的修改步骤,以及代码,与其他一些注意力机制相比,不仅准确度更高,而且模型更加轻量化。)

如果实验环境尚未搭建成功&#xff0c;可以参考这篇文章 ->【YOLOv8超详细环境搭建以及模型训练&#xff08;GPU版本&#xff09;】 文章链接为&#xff1a;http://t.csdnimg.cn/8ZmAm ---------------------------------------------------------------------------​---…

亲测有效,长期有效的RTSP流地址公网RTSP地址,各种类型的视频源

我们经常需要做一些实时视频流的测试&#xff0c;但是手边又没有办法及时弄到一个摄像机&#xff0c;我们经常会去搜索一下“公网RTSP地址”&#xff0c;但是大部分现在都失效了&#xff0c;有什么办法能够让我们快速构建一个RTSP流&#xff0c;点几下就能直接用&#xff1f; …

C++ 在项目中使用Linux命令

一: 选择shell Linux 命令是由shell解析并转发给操作系统执行的&#xff0c;所有的shell都是从 Bourne shell&#xff08;/bin/sh&#xff09;派生的&#xff0c;Bourne shell是贝尔实验室为早期版本的Unix开发的标准shell。 每个Unix系统都需要一个版本的Bourne shell才能正…

Maple常用命令

1. 重启内核&#xff1a; restart 2. 化简式子 simplify(式子) 3. 引用前面出现的公式&#xff1a; CtrlL&#xff0c;在弹出的以下对话框中输入要引用的公式编号 4.

Pandas的读写数据

目录 读写文件的类型 Excel写 API 准备数据 1.直接写入(默认有索引和标题) 2.写入(去掉索引) 3.写入(去掉索引和标题) 4.写入(去掉索引和标题,指定表单信息) Excel读 API 1.读(默认带有索引和标题) 2.读(指定索引项) 3.读(碰到无标题列和无索引列,指定索引列,标题列…

[SIGGRAPH-24] CharacterGen

[pdf | code | proj] LRM能否用于3D数字人重建&#xff1f;问题在于&#xff1a;1&#xff09;缺少3D数字人数据&#xff1b;2&#xff09;重建任意姿态的3D数字人不利于后续绑定和驱动。构建3D数字人数据集&#xff1a;在VRoidHub上采集数据&#xff0c;得到13746个风格化角色…

vue3中如何拿到vue2中的this

vue3中常用api vue3中常用响应式数据类型&#xff1a;

python3GUI--字符串加密方案(附源码)

文章目录 一&#xff0e;前言二&#xff0e;展示1.AES 加密1.介绍优点缺点2.代码3.结果 2.RSA 加密1.介绍优点缺点2.代码3.结果 3.基于 HMAC 的 URL 签名1.介绍优点缺点2.代码3.结果 4.JWT&#xff08;JSON Web Token&#xff09;加密1.介绍优点缺点2.安装3.代码4.结果 三&…

python运行时错误:找不到fbgemm.dll

python运行时错误&#xff1a;找不到fbgemm.dll 报错&#xff1a; OSError: [WinError 126] 找不到指定的模块。 Error loading "D:\program\py\312\Lib\site-packages\torch\lib\fbgemm.dll" or one of its dependencies. 原因是Windows下缺失&#xff1a;libomp140…

Aegisub字幕自动化及函数篇(图文教程附有gif动图展示)(一)

目录 自动化介绍 bord 边框宽度 随机函数 fsvp 随机颜色 move 自动化介绍 自动化介绍:简单来说自动化能让所有字幕行快速拥有你指定的同一种特效 对时间不同的行应用相同的效果 只要设计好一个模板&#xff0c;然后让所有行都执行这个模板上的特效就好了 首先制作模板行…

十八,Spring Boot 整合 MyBatis-Plus 的详细配置

十八&#xff0c;Spring Boot 整合 MyBatis-Plus 的详细配置 文章目录 十八&#xff0c;Spring Boot 整合 MyBatis-Plus 的详细配置1. MyBatis-Plus 的基本介绍2. Spring Boot 整合 MyBatis Plus 的详细配置3. Spring Boot 整合 MyBatis plus 注意事项和细节4. MyBatisx 插件的…

【论文阅读】3D Diffuser Actor: Policy Diffusion with 3D Scene Representations

Abstract 扩散policies是条件扩散模型&#xff0c;它学习以机器人和环境状态为条件的机器人动作分布。他们最近被证明优于确定性和替代的动作分布学习公式。3d机器人policies使用使用感知深度从单个或多个摄像机视图聚合的3d场景特征表示。它们已被证明比它们在相机视点上的 2…

反转字符串 II--力扣541

反转字符串 II 题目思路代码 题目 思路 本题的关键在于理解每隔 2k 个字符的前 k 个字符进行反转&#xff0c;剩余字符小于 2k 但大于或等于 k 个&#xff0c;则反转前 k 个字符。并且剩余字符少于 k 个&#xff0c;则将剩余字符全部反转。 让i每次跳2k&#xff0c;成为每一次…

根据 IP 地址进行 VPN 分流(详细,亲测,通用)

根据 IP 地址进行 VPN 分流&#xff08;详细&#xff0c;亲测&#xff0c;通用&#xff09; 背景 不在学校的时候需要使用实验室的服务器&#xff0c;但是实验室的服务器只能在校园网内访问&#xff0c;因此在校外就需要使用学校的 VPN&#xff0c;但是打开 VPN 以后会默认将…

【JUC】17-Synchronized锁升级

1. 锁分类 无锁->偏向锁->轻量级锁->重量级锁 synchronized属于重量级锁&#xff0c;monitor是基于底层os的mutex Lock实现了&#xff0c;挂起线程和恢复线程都需要内核态完成&#xff0c;都需要切换CPU状态来完成。 Monitor与对象以及线程如何关联&#xff1f;  1…

对答如流!面试官常考的Selenium Web自动化面试题总结

Selenium是一款基于Web功能测试的自动化测试框架。它的应运而生经历了不同时代&#xff0c;组成了一系列工具集&#xff0c;已然成为了Web功能自动化测试的首选“武器”。 本次主要基于Web功能自动化中常见面试题和大家交流分享。下面涉及到的代码示例以JAVA语言为例&#xff…

基于stm32的四旋翼无人机控制系统设计系统设计与实现

文章目录 前言资料获取设计介绍功能介绍设计程序 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业…

2024年【金属非金属矿山(露天矿山)安全管理人员】证考试及金属非金属矿山(露天矿山)安全管理人员复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 金属非金属矿山&#xff08;露天矿山&#xff09;安全管理人员证考试是安全生产模拟考试一点通总题库中生成的一套金属非金属矿山&#xff08;露天矿山&#xff09;安全管理人员复审模拟考试&#xff0c;安全生产模拟…