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

news2025/1/27 3:42:41

目录

介绍:

案例描述:

思路:

对要求分别分析实现:

创建对应的类:

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博客

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

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

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

相关文章

下拉选中搜索angularjs-dropdown-multiselect.js

需要引入angularjs-dropdown-multiselect.js 页面 <div ng-dropdown-multiselect"" options"supplierList_data" selected-model"supplierList_select" events"changSelValue_supplierList" extra-settings"mucommonsetti…

C#使用SQLite(含加密)保姆级教程

C#使用SQLite 文章目录 C#使用SQLite涉及框架及库复制runtimes创建加密SQLite文件生成连接字串执行SQL生成表SQLiteConnectionFactory.cs 代码结构最后 涉及框架及库 自己在NuGet管理器里面安装即可 Chloe.SQLite&#xff1a;ORM框架Microsoft.Data.Sqlite.Core&#xff1a;驱…

算法打卡day31|贪心算法篇05|Leetcode 435. 无重叠区间、763.划分字母区间、56. 合并区间

算法题 Leetcode 435. 无重叠区间 题目链接:435. 无重叠区间 大佬视频讲解&#xff1a;无重叠区间视频讲解 个人思路 和昨日的最少箭扎气球有些类似&#xff0c;先按照右边界排序&#xff0c;从左向右记录非交叉区间的个数。最后用区间总数减去非交叉区间的个数就是需要移除的…

uniapp中安装vant2

1.uniapp项目搭建 因为是安装vant2所以项目选择vue2&#xff0c;如果vue3项目的话安装vant3 2.安装vant npm i vantlatest-v2 3.在main.js文件引入挂载vant 说明&#xff1a;// #ifndef VUE3这里是vue2模板用来挂载注册组件的地方&#xff1b;// #ifdef VUE3这里是vue3模板…

基于Websocket的局域网聊天系统

1.1 研究背景及意义 本项目所对应领域的研究背景及意义[1]。新冠肺炎局域网通信发生以来&#xff0c;大数据、云计算、人工智能等新一代信息技术加速与交通、局域网通信、教育、金融等领域深度融合&#xff0c;让局域网通信防控的组织和执行更加高效&#xff0c;成为战“疫”的…

【Frida】【Android】06_夜神模拟器中间人抓包

&#x1f6eb; 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…

【Go】六、函数

文章目录 1、函数的定义2、内存分析3、注意点4、函数数据类型5、自定义数据类型&#xff08;起别名&#xff09;6、支持对返回值命名 1、函数的定义 语法&#xff1a; func 函数名&#xff08;形参列表)&#xff08;返回值类型列表&#xff09;{执行语句..return 返回值列…

你认为什么样的产品是一个好的产品?

1. 前言 尽管产品经理这一职位侧重于软技能,无需亲自设计或编写代码,但我们必须明确自己的职责和角色定位。这是为了强调,尽管产品经理的工作不一定涉及具体的技术实现,但对待每一个任务都应保持严肃和专注。 我们必须将产品经理视为一项严谨的专业,每一次的工作交流都是…

DFS:二叉树的深搜与回溯

一、计算布尔二叉树的值 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool evaluateTree(TreeNode* root) {if(root->leftnullptr) return root->val0?false:true; bool left evaluateTree(root->left);bool rightevaluateTree(root->rig…

PLC_博图系列☞P=:在信号上升沿置位操作数

PLC_博图系列☞P&#xff1a;在信号上升沿置位操作数 文章目录 PLC_博图系列☞P&#xff1a;在信号上升沿置位操作数背景介绍P&#xff1a;在信号上升沿置位操作数说明参数示例 关键字&#xff1a; PLC、 西门子、 博图、 Siemens 、 P 背景介绍 这是一篇关于PLC编程的文章…

手写简易操作系统(十五)--实现内核线程

前情提要 前面我们实现了内存管理系统&#xff0c;内存管理系统可以实现进程与进程之间的隔离。 Linux中高1GB是操作系统内核的地址&#xff0c;低3GB是用户的地址&#xff0c;高1GB对于所有用户都是一致的&#xff0c;低3GB才是用户自己的自留地。 既然已经实现了内存管理&…

大数据学习-2024/3/29-oracle使用介绍

在plsql中登录ORACLE数据。 默认用户&#xff1a; 1、sys&#xff1a; 角色&#xff1a;数据库超级管理员账户。 权限&#xff1a;具有最高的权限&#xff0c;可以执行任何操作&#xff0c;包括操作数据字典和控制文件。可以创建和删除数据库对象&#xff0c;授予和回收其他用户…

Redis中处理处理没有ACK确认的Stream

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Stream是一个只能追加内容的数据类型。也就是说Stream这种数据类型,我们…

FFmpeg将绿幕视频处理成透明视频播放

怎么在网页端插入透明视频呢&#xff0c;之前在做Web3D项目时&#xff0c;使用threejs可以使绿幕视频透明显示在三维场景中&#xff0c;但是在网页端怎么让绿幕视频透明显示呢&#xff1f; 如图上图&#xff0c;视频背景遮挡住后面网页内容 想要如下图效果 之前有使用过ffmpeg…

若依框架学习使用

若依官网项目拉取下来介绍 | RuoYi 项目运行&#xff1a; 1.idea安装&#xff0c;可以运行前后端 编辑器idea、jdk环境安装、数据库mysql、navicat工具、redis(redis-server启动)安装 2.navicat数据库连接, 创建数据库ry-vue并导入数据脚本ry_2021xxxx.sql&#xff0c;qua…

文章秒收录神器

在网络内容日益丰富的时代&#xff0c;网站的内容更新速度和收录效率变得愈发重要。有时候&#xff0c;我们需要确保自己的文章能够尽快被搜索引擎收录&#xff0c;以便更快地展现在用户面前。本文将介绍一些让文章秒收录的方法&#xff0c;以及一些被称为“文章秒收录神器”的…

JavaScript动态渲染页面爬取——Pyppeteer爬取实战

Pyppeteer爬取实战 爬取目标 电影网站https://spa2.scrape.center/ 任 务 通过Selenium遍历列表页&#xff0c;获取每部电影的详情页URL通过Selenium根据上一步获取的详情页URL爬取每部电影的详情页从详情页中提取每部电影的名称、类别、分数、简介、封面等内容。 爬取列表页…

LeetCode 452. 用最少数量的箭引爆气球

有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出一…

Java基本语法(变量,数据类型,关键字、)

目录 什么是变量 声明 声明方式 赋值方式 声明的同时进行赋值 变量命名规范 字符组成&#xff1a;变量名可以包含以下字符&#xff1a; 开头限制&#xff1a; 空格禁止&#xff1a; 关键字/保留字&#xff1a; 大小写敏感&#xff1a; 长度限制&#xff1a; 推荐风…

【多模态对比学习】我遇到的坑

对比学习踩坑记录 本文是对过去几个月来利用对比学习的思想来优化多模态学习任务的思路的总结&#xff0c;主要包含以下几个方面&#xff1a;为什么要用对比学习、跨模态中对比学习怎么用、对比的过程中负样本是不是越多越好、要不要推远所有的负样本、样本之间的语义碰撞如何缓…