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

news2024/11/16 10:24:00

文章目录

  • 前言
  • 一、 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.coloradmin.cn/o/2126761.html

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

相关文章

[论文笔记]ChatQA: Surpassing GPT-4 on Conversational QA and RAG

引言 今天来看一下上篇论文笔记中反复介绍的 ChatQA: Surpassing GPT-4 on Conversational QA and RAG。 为了简单&#xff0c;下文中以翻译的口吻记录&#xff0c;比如替换"作者"为"我们"。 我们介绍了 ChatQA&#xff0c;这是一个模型套件&#xff0c;一…

机器学习和深度学习的常见概念总结(面试用,多原创图和公式)

目录 使用说明一、未分类损失函数&#xff08;Loss Function&#xff09;1. **损失函数的作用**2. **常见的损失函数**2.1. **均方误差&#xff08;MSE, Mean Squared Error&#xff09;**2.2. **均方根误差&#xff08;RMSE, Root Mean Squared Error&#xff09;**2.3. **平均…

1. 运动控制指令概要(omron 机器自动化控制器)

机器自动化控制器——第一章 运动控制指令概要 1-1 运动控制指令PLCopen运动控制用功能块运动控制指令概要▶ 运动控制指令的种类▶ 状态变化▶ 运动控制指令的启动和状态▶ 异常处理▶ 执行运动控制指令时输入变量的变更(指令重启)▶ 通过选择缓存模式执行指令多重启动▶ 通过…

四川锦程消费金融有限责任公司2024年(第一批次)催收机构选型入库采购公告

四川锦程消费金融有限责任公司2024年&#xff08;第一批次&#xff09;催收机构选型入库采购公告 根据需要&#xff0c; 四川锦程消费金融有限责任公司决定对外公 开选型采购催收代理合作的催收机构&#xff0c;欢迎符合条件的催收 机构参与采购。具体公告如下&#xff1a; 一…

Redisson分布式锁实现及原理详解

随着技术快速发展&#xff0c;数据规模增大&#xff0c;分布式系统越来越普及&#xff0c;一个应用往往会部署在多台机器上&#xff08;多节点&#xff09;&#xff0c;在有些场景中&#xff0c;为了保证数据不重复&#xff0c;要求在同一时刻&#xff0c;同一任务只在一个节点…

Makefile中的override

若对变量进行赋值一部分需要由命令行&#xff08;注意命令行只能使用/:/进行赋值&#xff0c;不能使用&#xff1f;进行赋值&#xff09;输入完成&#xff0c;一部分需要写在Makefile文件里&#xff0c;Makefile规则默认会让命令行的赋值覆盖文件里的赋值。要想解决这个问题&am…

【源码+文档+调试讲解】高校研招信息共享系统

摘 要 近年来&#xff0c;科技飞速发展&#xff0c;在经济全球化的背景之下&#xff0c;互联网技术将进一步提高社会综合发展的效率和速度&#xff0c;互联网技术也会涉及到各个领域&#xff0c;而高校研招信息共享系统在网络背景下有着无法忽视的作用。信息管理系统的开发是…

log4j靶场,反弹shell

1.用vulhub靶场搭建&#xff0c;首先进入目录CVE-2021-44228中&#xff0c;docker启动命令 2.发现端口是8983&#xff0c;浏览器访问http://172.16.1.18:8983/ 3.用dnslog平台检测dns回显&#xff0c;看看有没有漏洞存在 4.反弹shell到kali&#xff08;ip为172.16.1.18&#xf…

【白话Spring】三级缓存

快速导航 一、Spring的三级缓存是什么&#xff1f;三级缓存SpringBean 的生命周期&#xff1a;BeanFactory关于Bean初始化注释&#xff1a;分析&#xff1a;Bean的创建过程&#xff1a;Bean的销毁过程&#xff1a; Spring Bean创建的核心逻辑&#xff1a; 二、Spring的三级缓存…

CentOS7 使用yum报错:[Errno 14] HTTP Error 404 - Not Found 正在尝试其它镜像。

CentOS7 使用yum报错&#xff1a;[Errno 14] HTTP Error 404 - Not Found 正在尝试其它镜像。 CentOS镜像下载、VM虚拟机下载 下载地址&#xff1a;www.macfxb.cn 一、问题描述 安装完CentOS7 后 使用yum报错 如下图 二、解决方案 1.查看自己的系统架构 我的是aarch64 uname …

【MySQL】查询语句之inner、left、right、full join 的区别

前言&#xff1a; INNER JOIN 和 OUTER JOIN 是SQL中常用的两种连接方式&#xff0c;用于从两表活多表中提取相关的数据。两者区别主要在于返回的 结果集 如何处理 匹配 与 不匹配 的行。 目录 1、INNER JOIN 2、OUTER JOIN 3、总结 1、INNER JOIN 称为内连接&#xff0c;只…

ComfyUI-AdvancedLivePortrait:实时编辑人脸让图像动起来

经常使用Stable Diffiusion的朋友都知道&#xff0c;webUI和comfyUI底层都是Stable Diffiusion&#xff0c;但是它们的显示界面有非常大的区别&#xff1a;webUI界面简洁&#xff0c;新手比较容易上手&#xff1b;而ComfyUI 是采用基于节点的图形界面&#xff0c;通过连接不同的…

面向 NetworkX 用户的加速生产就绪型图形分析

目录 借助 NetworkX 轻松进行图形分析 使用 cuGraph 加速图形分析 使用 ArangoDB 进行生产就绪型图形分析 借助 cuGraph 和 ArangoDB 实现 GPU 加速分析 实施示例 测试环境 下载数据 创建 NetworkX 图形 在不使用 ArangoDB 的情况下运行 cuGraph 算法 将 NetworkX 图…

【Qt 即时通讯项目】登录验证码是如何做到的呢

文章目录 1. 登录注册功能验证码实现2. 验证码生成的流程3. 细节部分 1. 登录注册功能验证码实现 &#x1f427;①目的&#xff1a;引入验证码&#xff0c;目的是用来避免程序被其它程序暴力破解的方式找到密码。 2. 验证码生成的流程 ①&#x1f34e;首先通过Qt的QRandomGen…

初始Linux 和 各种常见指令

目录 Linux背景 1. 发展史 Linux发展历史 1.历史 2. 开源 Linux下基本指令 01. ls 指令 02. pwd命令 03. cd 指令 04. touch指令 05.mkdir指令&#xff08;重要&#xff09;&#xff1a; 06.rmdir指令 && rm 指令&#xff08;重要&#xff09;&#xff1a; …

OpenCV结构分析与形状描述符(20)计算一个包围给定点集的最小外接圆函数minEnclosingCircle()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 找到一个包围二维点集的最小面积的圆。 该函数使用迭代算法来寻找一个二维点集的最小外接圆。这意味着函数将会通过反复逼近的过程来计算出能够…

【Shiro】Shiro 的学习教程(四)之 SpringBoot 集成 Shiro 原理

目录 1、第一阶段&#xff1a;启动服务&#xff0c;构建类的功能2、第二阶段&#xff1a;正式请求 1、第一阶段&#xff1a;启动服务&#xff0c;构建类的功能 查看 Shiro 配置类 ShiroConfiguration&#xff1a; Configuration public class ShiroConfiguration {// 创建 sh…

算法里面的离散化

一、离散化&#xff08;discretization&#xff09;在算法和数据结构中指的是将连续的输入数据映射到离散的值或者范围&#xff0c;从而使得处理和计算变得更高效。通常用于处理大范围或者无限可能的输入&#xff0c;以便将其转化为有限的、可以有效处理的范围。 离散化的定义…

opencv之傅里叶变换

文章目录 前言理论基础Numpy实现傅里叶变换实现傅里叶变换实现逆傅里叶变换 高通滤波示例OpenCV实现傅里叶变换实现傅里叶变换实现逆傅里叶变换 低通滤波示例 前言 图像处理一般分为空间域处理和频率域处理。 空间域处理是直接对图像内的像素进行处理。空间域处理主要划分为灰…

Mysql基础练习题 1757.可回收且低脂的产品(力扣)

编写解决方案找出既是低脂又是可回收的产品编号。 题目链接&#xff1a; https://leetcode.cn/problems/recyclable-and-low-fat-products/description/ 建表插入数据&#xff1a; Create table If Not Exists Products (product_id int, low_fats ENUM(Y, N), recyclable …