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

目录

介绍:

案例描述:

思路:

对要求分别分析实现:

创建对应的类:

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.hqwc.cn/news/579161.html

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

相关文章

Java项目:80 springboot师生健康信息管理系统

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 系统的角色&#xff1a;管理员、宿管、学生 管理员管理宿管员&#xff0c;管理学生&#xff0c;修改密码&#xff0c;维护个人信息。 宿管员…

数据结构——链表(单链表)

大家好&#xff0c;又是我&#xff08;小锋&#xff09;&#xff0c;今天给大家带了一个比较有挑战的章节&#xff08;链表&#xff09;&#xff0c;但是不用担心&#xff0c;小锋会陪大家一起度过。 顺序表的思考与问题 1. 中间/头部的插入删除&#xff0c;时间复杂度为O(N) …

从TCP/IP协议到socket编程详解

​ 我的所有学习笔记&#xff1a;https://github.com/Dusongg/StudyNotes⭐⭐⭐ ​ 文章目录 1 网络基础知识1.1 查看网络信息1.2 认识端口号1.3 UDP1.4 TCP1.4.1 确认应答机制1.4.2 TCP三次握手/四次挥手为什么是三次握手为什么是四次挥手listen 的第二个参数 backlog—— 全…

Day55:WEB攻防-XSS跨站CSP策略HttpOnly属性Filter过滤器标签闭合事件触发

目录 XSS跨站-安全防御-CSP XSS跨站-安全防御-HttpOnly XSS跨站-安全防御-XSSFilter(过滤器的意思) 1、无任何过滤 2、实体化 输入框没有 3、全部实体化 利用标签事件 单引号闭合 4、全部实体化 利用标签事件 双引号闭合 5、事件关键字过滤 利用其他标签调用 双引号闭合…

进程调度算法

进程调度算法 进程调度算法先来先服务调度基于优先级调度&#xff08;Priority Scheduling&#xff09;短进程优先 / 最短剩余时间优先轮转法&#xff08;Round-Robin Scheduling&#xff09;高响应比优先调度算法&#xff08;Highest Response Ratio Next&#xff09;多级反馈…

亚信安全联合人保财险推出数字安全保障险方案,双重保障企业数字化转型

数字化发展&#xff0c;新兴技术的应用与落地带来网络攻击的进一步演进升级&#xff0c;同时全球产业链供应链融合协同的不断加深&#xff0c;更让网络威胁的影响范围与危害程度不断加剧。 企业单纯依靠自身安全能力建设&#xff0c;能否跟上网络威胁的进化速度&#xff1f;能否…

使用nvm管理nodejs版本

文章目录 1、下载NVM2、选择NVM安装3 、查询版本号&常用命令4、nvm命令安装指定版本node4.1 安装指定node4.2 查看是否安装成功4.3 切换node版本到你想要的版本4.4 再次查看nvm版本列表4.5 nvm其他常用命令 这个是每个全能前端经常会用到的&#xff0c;之前用过现在重装了&…

目前现货黄金行情技术分析

目前行情黄金可以投资吗&#xff1f;不论是黄金价格怎么波动&#xff0c;总是有投资者问这个问题&#xff0c;原因是他们搞不清现状&#xff0c;弄不懂当前的市场形势&#xff0c;对于技术分析和基本分析的方法也不甚了解&#xff0c;因此缺乏对未来行情判断的能力。下面我们就…

探究分布式事务:深入ACID特性在分布式系统中的挑战与解决方案

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起进步&am…

代码随想录训练营Day37:● 738.单调递增的数字 ● 968.监控二叉树 ● 总结

738.单调递增的数字 题目链接 https://leetcode.cn/problems/monotone-increasing-digits/description/ 题目描述 思路 从后往前遍历数字的每一位&#xff0c;如果前一位大于后一位&#xff0c;则将其减一&#xff0c;后边的一位取 i-9 中最大的 解答的两点疑惑&#xff1a;…

类中属性赋值过程

1 、在类的属性中&#xff0c;可以有哪些位置给属性赋值&#xff1f; ① 默认初始化 package chapter06_oop1.src.com.atguigu09.bean_uml;public class UserTest {public static void main(String[] args) {User u1 new User();System.out.println(u1.age);} }class User{/…

【深度学习目标检测】二十四、基于深度学习的疲劳驾驶检测系统-含数据集、GUI和源码(python,yolov8)

设计一个疲劳驾驶检测系统的重要性主要体现在以下几个方面&#xff1a; 提高道路安全&#xff1a;疲劳驾驶是引发交通事故的重要因素之一。驾驶员在长时间驾驶或缺乏休息的情况下&#xff0c;反应速度和判断能力会显著下降&#xff0c;从而增加事故风险。通过实时检测驾驶员的疲…