数组类模板(类模拟实现静态数组)

目录

介绍:

案例描述:

思路:

对要求分别分析实现:

创建对应的类:

1.定义一个数组类

2.类中属性有:数组, 容量, 大小

3.数组函数有:

构造函数(容量)

拷贝构造---->operator=(重载 = )

尾插法

尾删法

获取数组容量

 获取数组大小

析构函数

总代码:

效果展示:



介绍:

该篇文章是模仿静态数组的类,也就是简单数组,不可扩容

案例描述:


实现一个通用的数组类,要求如下:
1.可以对内置数据类型以及自定义数据类型的数据进行存储
2.将数组中的数据存储到堆区
3.构造函数中可以传入数组的容量
4.提供对应的拷贝构造函数以及 operator =防止浅拷贝问题
5.提供尾插法和尾刷法对数组中的数据进行增加和删除
6.可以通过下标的方式访问数组中的元素
7.可以获取数组中当前元素个数和数组的容量 


思路:

对要求分别分析实现:

1.可以对内置数据类型以及自定义数据类型的数据进行存储 ------ 将数组的数据类型设置为elemtype 
2.将数组中的数据存储到堆区 ----- new
3.构造函数中可以传入数组的容量 ---- 构造函数
4.提供对应的拷贝构造函数以及 operator =防止浅拷贝问题 ----- 重载=
5.提供尾插法和尾刷法对数组中的数据进行增加和删除 ---- 增加删除元素函数
6.可以通过下标的方式访问数组中的元素 ---- 重载[]
7.可以获取数组中当前元素个数和数组的容量 ----- 访问函数

创建对应的类:


1.定义一个数组类

class myArr
{
public:

private:
};


2.类中属性有:数组, 容量, 大小

该处要注意容量和大小不同:

容量:数组的可存放的元素个数

大小:数组已存放的数量个数 

class myArr
{
public:

private:
	elemtype* arr;
	int myCapacity;
	int mySize;
};


3.数组函数有:

构造函数(容量)
	myArr(int Capacity)
	{
		myCapacity = Capacity;/**/
		mySize = 0;/**/

		arr = new elemtype[Capacity];/*注意不可直接定义,要在堆区上new一块空间*/
	}
拷贝构造---->operator=(重载 = )
	myArr(const myArr& p)
	{
		myCapacity = p.myCapacity;
		mySize = p.mySize;

		arr = new elemtype[myCapacity];/*注意要new空间,否则就是浅拷贝,会出现堆内存重复释放,还继续非法访问的问题*/
		for (int i = 0; i < mySize; i++)
		{
			arr[i] = p.arr[i];
		}
	}

尾插法

    void endInsert(int e)
	{
		if (mySize > myCapacity)
		{//模仿数组越界时的报错(直接终止程序)
			cout << "数组元素过多,超过容量,增加失败" << endl;
			exit(0);//终止程序(比return结束程序更彻底,return是返回上一层结果,而exit直接停止程序)
		}
		arr[mySize] = e;
		mySize++;
	}

若调用的是如下代码:

int main()
{
	myArr a(10);
	a.endInsert(1);
	a.endInsert(2);
	a.endInsert(3);
	a.endInsert(4);
	a.endInsert(5);

	a.endInsert(1);
	a.endInsert(2);
	a.endInsert(3);
	a.endInsert(4);
	a.endInsert(5);

	a.endInsert(1);
	a.endInsert(2);
	a.endInsert(3);
	a.endInsert(4);
	a.endInsert(5);

	cout << "数组的容量为:" << a.getCapacity() << " " << "数组大小为:" << a.getSize() << endl;
	int asize = a.getSize();
	cout << "a的数组元素为:";
	for (int i = 0; i < asize; i++)
		cout << a[i] << " ";
	cout << endl;

	return 0;
}

 这里初始化数组时只分配了10个数据的大小的内存,但是加入的数据有15个,发生了越界,因此会报错:

 

直接结束程序(请按任意键关闭此窗口),而没有继续打印数组元素 

尾删法
	void endDelete()
	{
		mySize--;
	}

获取数组容量
	int getCapacity()
	{
		return myCapacity;
	}
 获取数组大小

	int getSize()
	{
		return mySize;
	}
析构函数
    ~myArr()
	{
		// delete arr[];//错误写法
		delete[] arr;//delete要提前知道释放的是数组

		myCapacity = 0;
		mySize = 0;
	}

总代码:

				/*数组类模板*/


//类模板案例
//案例描述:实现一个通用的数组类,要求如下:
//
//.可以对内置数据类型以及自定义数据类型的数据进行存储 ------ 将数组的数据类型设置为elemtype 
// .将数组中的数据存储到堆区 ----- new
//.构造函数中可以传入数组的容量 ---- 构造函数
//·提供对应的拷贝构造函数以及 operator =防止浅拷贝问题 ----- 重载=
//.提供尾插法和尾刷法对数组中的数据进行增加和删除 ---- 增加删除元素函数
// ·可以通过下标的方式访问数组中的元素 ---- 重载[]
//.可以获取数组中当前元素个数和数组的容量 ----- 访问函数


/*
思路:
1.定义一个数组类
2.类中属性有:数组, 容量, 大小
3.数组函数有:构造函数(容量), 拷贝构造,operator=,利用下标的方式访问数组中的元素,
尾插法,尾删法,获取数组容量, 获取数组大小,析构
*/

#include <iostream>
#include <stdlib.h>

using namespace std;

typedef int elemtype;

class myArr
{
public:
	myArr(int Capacity)
	{
		myCapacity = Capacity;
		mySize = 0;

		arr = new elemtype[Capacity];
	}

	myArr(const myArr& p)
	{
		myCapacity = p.myCapacity;
		mySize = p.mySize;

		arr = new elemtype[myCapacity];
		for (int i = 0; i < mySize; i++)
		{
			arr[i] = p.arr[i];
		}
	}

	int getSize()
	{
		return mySize;
	}

	int getCapacity()
	{
		return myCapacity;
	}

	void endInsert(int e)
	{
		if (mySize > myCapacity)
		{//模仿数组越界时的报错
			cout << "数组元素过多,超过容量,增加失败" << endl;
			exit(0);//终止程序(比return结束程序更彻底,return是返回上一层结果,而exit直接停止程序)
		}
		arr[mySize] = e;
		mySize++;
	}

	void endInsert()
	{
		mySize--;
	}

	int operator[](int idx)
	{
		return arr[idx];
	}

	~myArr()
	{
		// delete arr[];//错误写法
		delete[] arr;

		myCapacity = 0;
		mySize = 0;
	}
private:
	elemtype* arr;
	int myCapacity;
	int mySize;
};

int main()
{
    //构造a数组,容量为10个
	myArr a(10);

    //给a中插入数据
	a.endInsert(1);
	a.endInsert(2);
	a.endInsert(3);
	a.endInsert(4);
	a.endInsert(5);

	//a.endInsert(1);
	//a.endInsert(2);
	//a.endInsert(3);
	//a.endInsert(4);
	//a.endInsert(5);

	//a.endInsert(1);
	//a.endInsert(2);
	//a.endInsert(3);
	//a.endInsert(4);
	//a.endInsert(5);

    //打印a数组,当然可以封装为函数
	cout << "数组的容量为:" << a.getCapacity() << " " << "数组大小为:" << a.getSize() << endl;
	int asize = a.getSize();
	cout << "a的数组元素为:";
	for (int i = 0; i < asize; i++)
		cout << a[i] << " ";
	cout << endl;


	myArr b(a);
	int bsize = b.getSize();
	cout << "b的数组元素为:";
	for (int i = 0; i < bsize; i++)
		cout << b[i] << " ";
	cout << endl;

	return 0;
}

效果展示:

完结撒花~恭喜你又进步一点点啦~ 

如果你喜欢博主的话,用你的小手点点赞哦,点点收藏,如果想看博主的后序创作,可以点点关注哦

 ✨欢迎支持✨

      🎈创作不易,麻烦点点赞哦🎈

博主主页:脑子不好的小菜鸟

该文章专栏:项目_脑子不好的小菜鸟的博客-CSDN博客

文章特点:关键点和步骤讲解放在代码相应位置,大多为算法和刷题文章

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Oracle EBS AR接口和OM销售订单单价为空数据修复

最近,用户使用客制化Web ADI 批量导入销售订单行功能,把销售订单行的单价更新成空值,直到发运确认以后,财务与客户对帐才发现大量销售订单的单价空,同时我们检查AR接口发现销售订单的单价和金额均为空。 前提条件 采用PAC成本方式具体问题症状 销售订单行的单价为空 Path:…

车载以太网AVB交换机 gPTP透明时钟 6口 百兆车载以太网交换机

SW100TE百兆车载以太网交换机 一、产品简要分析 6端口百兆车载以太网交换机&#xff0c;其中包含5通道100BASE-T1泰科MATEnet接口和1个通道100BASE-TX标准以太网(RJ45接口)&#xff0c;可以实现车载以太网多通道交换&#xff0c;车载以太网数据采集和模拟&#xff0c;Bypass数…

Discourse 最多允许有几个分类级别

和 DISCUZ 不同&#xff0c;DISCUZ 可以允许分类下面还有分类&#xff0c;再继续分类这种嵌套式分类。 Discourse 最多只允许有 2 个分类。 如果你在已有的分类下再继续分类的话&#xff0c;系统会提示错误&#xff1a; 意思就是子分类不能再分子分类。 Discourse 尽量采取了…

Chapter 1 - 6. Introduction to Congestion in Storage Networks

NVMe/TCP NVMe/TCP carries NVMe commands over TCP transport (Figure 1-8) for accessing remote block storage via a lossy or sometimes lossless network. It is an OSI layer 5 (sessions layer) protocol. NVMe/TCP 通过 TCP 传输(图 1-8)传输 NVMe 命令,以便通过有…

pnpm、monorepo分包管理、多包管理、npm、vite、前端工程化、保姆级教程

浅尝pnpm monorepo 多包管理方案 &#x1f4a1;tips: 创建pnpm monorope多包管理框架流程 初始化 mkdir taurus & cd taurus pnpm init创建基础文件 创建文件pnpm-workspace.yaml packages:- packages/**创建文件夹packages/ -packages/ -package.json -pnpm-workspace…

一周学会Django5 Python Web开发-Django5模型分页查询

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计43条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

初步了解C++

目录 一&#xff1a;什么是C&#xff1f; 二.C发展史 三:C关键字 四&#xff1a;命名空间 4.1命名空间的介绍 4.2命名空间的使用 4.3命名空间的使用 4.3.1使用作用域限定符 4.3.2 使用using将命名空间的某个成员引入 4.3.3使用using把整个命名空间展开 4.4命名空…

软件测试计划

1测试目的 2测试范围 3资源要求 3.1人力资源 3.2指派干系人 3.3测试环境 3.4测试工具 4测试类型 5测试安排 5.1测试进度 5.2测试策略 5.2.1测试需求 5.2.2测试类型 6测试停止标准 7测试风险 8缺陷管理 8.1缺陷属性 8.2缺陷类型 8.3缺陷严重程度 8.4缺陷优先…

(十一)图像的罗伯特梯度锐化

环境&#xff1a;Windows10专业版 IDEA2021.2.3 jdk11.0.1 OpenCV-460.jar 系列文章&#xff1a; &#xff08;一&#xff09;PythonGDAL实现BSQ&#xff0c;BIP&#xff0c;BIL格式的相互转换 &#xff08;二&#xff09;BSQ,BIL,BIP存储格式的相互转换算法 &#xff08;三…

windows无法使用hadoop报错:系统找不到路径

在windows下安装hadoop-3.1.4,进行环境变量配置后&#xff0c;打开window命令行窗口测试hadoop命令&#xff0c;报错&#xff0c;如图所示&#xff1a; 方案&#xff1a;由于JAVA_HOME路径有空格导致&#xff0c;可修改hadoop下\etc\hadoop\hadoop_env.cmd文档中set JAVA_HOME以…

Beans模块之工厂模块DisposableBean

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…

【软件工程导论】——Visio与StarUML的安装

目录 &#x1f552; 1. Visio&#x1f552; 2. StarUML &#x1f552; 1. Visio 1、下载Office Tool Plus并安装&#xff1a;&#x1f50e; Office Tool Plus官网 2、打开软件 → 部署 → 添加产品 3、这里我选择Visio 2021 专业版 LTSC&#xff0c;确定&#xff0c;随后点击“…

ABAP AMDP 示例

AMDP 是HANA开发中的一种优化模式 按SAP的官方建议&#xff0c;在可以使用Open SQL实现需要的功能或优化目标的时候&#xff0c;不建议使用AMDP。而在需要使用Open SQL不支持的特性&#xff0c;或者是大量处理流和分析导致了数据库和应用服务器之间有重复的大量数据传输的情况…

自动化潮流框架——Playwright 大解密!

一说到自动化测试&#xff0c;第一个反应估计就是Pythonselenium这样的一个组合&#xff0c;其实在2020年的时候市面上就出现了另一个由微软发布的一款UI自动化测试工具&#xff0c;叫Playwright。经过几年的迭代和技术的沉淀&#xff0c;该工具受到越来越多的人重视和青睐。 B…

印度神体系与编程思维

印度神体系中存在三大主神&#xff1a;至高神梵天、毗湿奴以及湿婆。 1.神的类型抽象与神性优先级&#xff1a; 每一个神都掌握着世间中所存在的规律&#xff0c;比如天界里因陀罗&#xff08;帝释天&#xff09;等神掌控风火水电。换句话说&#xff0c;每一个可以抽象出来的世…

5-规范设计(下):commit信息风格迥异、难以阅读,如何规范?

我们在做代码开发时&#xff0c;经常需要提交代码&#xff0c;提交代码时需要填写 Commit Message&#xff08;提交说明&#xff09;&#xff0c;否则就不允许提交。 所以在 Go 项目开发时&#xff0c;一个好的 Commit Message 至关重要&#xff1a; 可以使自己或者其他开发人…

U盘文件突然消失?原因与恢复策略全解析

一、遭遇不测&#xff1a;U盘文件突然消失 在日常生活和工作中&#xff0c;U盘扮演着不可或缺的角色&#xff0c;它小巧便捷&#xff0c;能够随时随地存储和传输文件。然而&#xff0c;有时我们会遭遇一个令人头疼的问题&#xff1a;U盘中的文件突然消失。这种突如其来的变故往…

Oracle利用BBED恢复崩溃实例(ORA-01092,ORA-00704,ORA-01578)

BBED修复数据损坏引起的数据库崩溃&#xff08;ORA-01092,ORA-00704,ORA-01578&#xff09;(2021年某苏州国企的案例&#xff09; 1.Symptom 用户一个边缘系统出现数据文件损坏&#xff0c;且没有备份&#xff0c;数据库无法启动 报错如下&#xff0c;发现是oracle bootstra…

redis集群配置(精华版):主从复制模式

主从复制模式 概念&#xff1a;作用&#xff1a;为什么使用集群&#xff1a;动手实操1、环境准备2、配置redis.conf配置文件3、再次查看主从节点信息4、验证主从模式 概念&#xff1a; ​ 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器…

29 超级数据查看器 APP视频教程 查询复用

29 超级数据查看器 APP视频教程 查询复用 超级数据查看器 查询复用 最下方有 讲解稿全文 有兴趣的朋友可以看看 超级数据查看器是安卓手机上的APP&#xff0c;软件。 具有导入excel表格数据&#xff0c;存入手机内置的数据库&#xff0c;生成查询模块&#xff0c;快速查询数…