模拟实现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.rhkb.cn/news/421508.html

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

相关文章

记一次导入dbf文件后数据为空问题的解决方法

前言 省流&#xff1a;这篇文章最终采用的是更换导出文件格式的方法&#xff0c;看到这里觉得方法不适用的小伙伴可以不用浪费几秒钟看完这篇文章哦。 问题描述 作者使用的是Navicat数据库管理工具&#xff0c;然后在将源数据库的数据表导出为dbf格式文件后&#xff0c;再将…

Linux进阶命令-echodatealias

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 经过上一章Linux日志的讲解&#xff0c;我们对Linux系统自带的日志服务已经有了一些了解。我们接下来将讲解一些进阶命令&am…

JAVA中获取类的超类(父类)或接口的class类型

一、前言 这里所说的超类&#xff08;父类&#xff09;或接口&#xff0c;指的就是某个类继承了一个类或实现了N个接口。 比如ArrayList&#xff0c;它继承了一个类&#xff08; java. util. AbstractList<E> &#xff09;&#xff0c;这时候AbstractList就称为ArrayLi…

如何让人工智能训练更快

影响人工智能训练时间的因素 在深度学习训练中&#xff0c;训练时间的计算涉及到多个因素&#xff0c;包括 epoch 数、全局 batch size、微 batch size、计算设备数量等。下面是一个基本的公式来说明这些参数之间的关系&#xff08;注意&#xff0c;这只是一个基本的说明公式&…

ctfshow-文件包含

web78 <?phpif(isset($_GET[file])){$file $_GET[file];include($file); }else{highlight_file(__FILE__); } 判断是否存在file参数 如果存在 将包含这个参数值 文件 php://filter可以获取指定文件源码。当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执…

Jmeter终极线程组“Ultimate Thread Group“如何使用?

1、安装,点击"选项"&#xff0c;再点击"Plugins Manager"&#xff0c;下载"Custom Thread Groups" 2、添加"jpgc - Ultimate Thread Group" 3、"jpgc - Ultimate Thread Group"使用

DC 板 boot 测 nor 兼容性记录(qspi )

DC 板 boot 测 nor 兼容性记录&#xff08;qspi &#xff09; 软件问题&#xff1a; 1、DC板在跑 qspi时&#xff0c;在跑ddr 初始化部分需要修改以下参数&#xff0c;否则会在fsbl stage1 或者 stage 3 出错。 Board配置选 ad101_v10&#xff1b; 2、由于socket与DC板接触可能…

【springboot】父子工程项目搭建

父工程创建 1.新建一个spring项目 2.选择合适的springboot版本&#xff0c;点击【完成】&#xff0c;即创建父工程完毕 3.删除父工程中无用文件&#xff1a;src 创建子工程模块 1.右键项目名->新建&#xff08;news&#xff09;->模块&#xff08;Module&#xff09;…

【linux-Day2】linux下的基本指令

【linux-Day2】linux下的基本指令 一键查看操作系统的重要地位linux下的基本指令&#x1f4e2;ls&#xff1a;显示当前目录下所有的子目录和文件&#x1f4e2;pwd&#xff1a;显示用户当前所在的目录&#xff0c;在windows中&#xff0c;相当于显示当前目录的绝对路径。&#x…

Oracle绑定变量窥视与自适应游标共享

一.Oracle的绑定变量窥视与自适应游标共享 创建test表&#xff0c;列status存在2个值&#xff0c;有数据倾斜&#xff0c;在列status create table test as select rownum id,DBMS_RANDOM.STRING(A,12) name,DECODE(MOD(ROWNUM,500),0,Inactive,Active) status from all_obj…

2024最新精选文章!分享5款论文ai生成软件

在2024年&#xff0c;AI论文生成软件的出现极大地提升了学术写作的效率和质量。这些工具不仅能够帮助研究人员快速生成论文草稿&#xff0c;还能进行内容优化、查重和排版等操作。以下是五款值得推荐的AI论文生成软件&#xff0c;其中特别推荐千笔-AIPassPaper。 ### 千笔-AIPa…

【Jupyter Notebook】汉化

1.打开:Anaconda Prompt 2.输入:"activate Zhui01"(注意&#xff1a;Zhui01是刚创建的环境名字) activate Zhui01 3.输入:"pip install jupyterlab-language-pack-zh-CN" pip install jupyterlab-language-pack-zh-CN 4.打开:Jupyter Notebook 5.点击&q…

【稀疏矩阵】使用torch.sparse模块

文章目录 稀疏矩阵的格式coocsrcsc Construction of Sparse COO tensorsConstruction of CSR tensorsLinear Algebra operations&#xff08;稀疏与稠密之间混合运算&#xff09;Tensor methods and sparse&#xff08;与稀疏有关的tensor成员函数&#xff09;coo张量可用的ten…

E32.【C语言 】练习:蓝桥杯题 懒羊羊字符串

1.题目 【问题描述】 “懒羊羊”字符串是一种特定类型的字符串&#xff0c;它由三个字符组成&#xff0c;具有以下特点: 1.字符串长度为 3. 2.包含两种不同的字母。 3.第二个字符和第三个字符相同 换句话说&#xff0c;“懒羊羊”字符串的形式应为 ABB&#xff0c;其中A和B是不…

Python去中心化身份验证指南

随着区块链技术的发展,去中心化身份验证系统成为了保护个人数据安全和确保数字身份不被篡改的重要工具。本文将介绍如何利用Python和区块链技术构建一个简单的去中心化身份验证系统,包括基本概念、实现步骤和代码示例。 什么是去中心化身份验证系统? 去中心化身份验证系统…

SpringBoot学习(8)RabbitMQ详解

RabbitMQ 即一个消息队列&#xff0c;主要是用来实现应用程序的异步和解耦&#xff0c;同时也能起到消息缓冲&#xff0c;消息分发的作用。 消息中间件最主要的作用是解耦&#xff0c;中间件最标准的用法是生产者生产消息传送到队列&#xff0c;消费者从队列中拿取消息并处理&…

【网易低代码】第3课,页面表格删除功能

你好&#xff01; 这是一个新课程 CodeWave网易低代码 通过自然语言交互式智能编程&#xff0c;同时利用机器学 习&#xff0c;帮助低代码开发者进一步降低使用门槛、提高应用开发效率 【网易低代码】第3课&#xff0c;页面表格删除功能 1.拖拽组件link链接到表格中&#xff0c…

一文读懂在线学习凸优化技术

一文读懂在线学习凸优化技术 在当今的数据驱动时代&#xff0c;机器学习算法已成为解决复杂问题的关键工具。在线学习凸优化作为机器学习中的一项核心技术&#xff0c;不仅在理论研究上具有重要意义&#xff0c;还在实际应用中展现出巨大的潜力。本文将深入浅出地介绍在线学习…

初识C++|继承

&#x1f36c; mooridy-CSDN博客 &#x1f9c1;C专栏&#xff08;更新中&#xff01;&#xff09; 目录 1. 继承的概念及定义 1.1 继承的概念 1.2 继承定义 1.2.1 定义格式 1.2.2 继承父类成员访问方式的变化 1.3继承类模板 2. 父类和子类对象赋值兼容转换 3. 继承中的…

使用docker配置wordpress

docker的安装 配置docker yum源 sudo yum install -y yum-utils sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo下载最新版本docker sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-…