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

目录

介绍:

案例描述:

思路:

对要求分别分析实现:

创建对应的类:

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.mzph.cn/news/780859.shtml

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

相关文章

C++数塔问题

#include <iostream> #include <vector>using namespace std;int main() {// 读取输入int n;cin >> n;vector<vector<int>> tower(n, vector<int>(n));for (int i 0; i < n; i) {for (int j 0; j < i; j) {cin >> tower[i][…

排序---数组和集合

1、数组排序 Arrays.sort(int[] a)这种形式是对一个数组的所有元素进行排序&#xff0c;并且是按照从小到大的排序。 public static void main(String[] args) {Integer []arr {1,2,3,4,5,6};//升序Arrays.sort(arr);for (int x:arr){System.out.print(x " ");}Sys…

Maven:构建现代化软件项目的强大工具

在软件开发的世界中&#xff0c;Maven 是一个备受欢迎的构建工具。它提供了一种标准化、自动化的方式来管理项目的依赖、构建过程和部署。本文将深入探讨 Maven 的各个方面&#xff0c;帮助您更好地理解和使用这一强大的工具。 一、Maven 的简介 Maven 是一个基于项目…

axios请求类型是文件流怎么显示报错信息

axios请求类型是文件流&#xff0c;但是报错信息的话没法显示&#xff0c;在request.js文件中更改一下request拦截器代码&#xff1a; service.interceptors.request.use(config > { ...... , error > { console.log(error, 报错报错) // 处理请求错误 if (error.respons…

IRIS / Chronicles 定义 Item Response Type 字段属性

Response Type 在关系数据库中可能没有这个选项&#xff0c;我们对关系数据库表中的数据返回的数据就是是数据&#xff0c;通常不再做过多定义。 但是 IRIS 会对返回的数据也做一些定义&#xff0c;这个就是我们说的 Response Type。 Single &#xff08;单一&#xff09; 这…

二维随机变量的条件分布-已知X概率密度,X条件下的Y概率密度求解y的概率密度

问题&#xff1a;设数X在区间(0,1)上随机地取值,当观察到Xx(0<x<1)时,数Y在区间(x,1)上随机地取值.求Y的概率密度f(y)&#xff1f; 求解&#xff1a; 首先&#xff0c;数X在区间(0,1)上均匀分布&#xff0c;因此其概率密度函数fX​(x)为&#xff1a; fX​(x)1 0<…

Unity类银河恶魔城学习记录11-7 p109 Aplly item modifiers源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili ItemData_Equipment.cs using System.Collections; using System.Collecti…

K8S安装和部署(kubeadmin安装1主2从)

这里用kubeadmin方式进行安装部署 1. 准备三台服务器 服务器地址 节点名称 192.168.190.200 master 主 192.168.190.201 node1 从 192.168.190.202 node2 从 2. 主机初始化&#xff08;所有主机&#xff09; 2.1根据规划设置主机名 #切换到192.168.190.200 hostnamectl…

FastAPI+React全栈开发09 MongoDB的增删改查操作

Chapter02 Setting Up the Document Store with MongoDB 09 MongoDB querying and CRUD operations FastAPIReact全栈开发09 MongoDB的增删改查操作 After all this setting up, downloading, and installing, it is finally time to see MongoDB in action and try to get …

327京东一面

1.项目相关 2.手撕SQL 两道 3.JMeter性能测试 首先&#xff0c;进行基准测试&#xff1a; 单用户测试&#xff08;单用户循环多次得到的数据&#xff09;&#xff1b;为多用户并发执行提供参考 其次&#xff0c;进行负载测试&#xff1a; 通过逐步增加系统负载&#xff0…

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

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

Linux系统中安装一些常用的插件备用

Linux系统中安装一些常用的插件备用 1.安装wget yum -y install wget 2.安装vim yum -y install vim-enhanced 3.更换yum源为国内的阿里云源&#xff08;选择&#xff09; 1、备份CentOS-Base.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.…

OpenCV的安装与配置

OpenCV安装 OpenCV&#xff0c;全称Open Source Computer Vision Library&#xff0c;是一个开源的计算机视觉库&#xff0c;它包含了大量的图像处理函数和计算机视觉算法。为了更好地学习和应用OpenCV&#xff0c;首先需要将其正确地安装到我们的计算机上。以下是一份关于Ope…

代码随想录算法训练营第二十四天| 理论基础,77. 组合

题目与题解 参考资料&#xff1a;回溯法理论基础 带你学透回溯算法&#xff08;理论篇&#xff09;| 回溯法精讲&#xff01;_哔哩哔哩_bilibili 77. 组合 题目链接&#xff1a;​​​​​​​​​​​​​​77. 组合 代码随想录题解&#xff1a;77. 组合 视频讲解&#xff…

InputStreamReader类详解

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

【常见面试题】Golang中,协程数最多可以开多少个?

参考&#xff1a; Goroutine 究竟可以开多少&#xff1f; 一、先说结论&#xff1a; 能开多少个协程&#xff0c;取决于单个协程处理方法所占用的CPU和内存资源&#xff08;也就是看你计算机运行的应用程序的具体代码逻辑&#xff09;。 二、具体来说&#xff1a; 如果是C…

深入解析Windows Edge兼容性问题及其修复策略

深入解析Windows Edge兼容性问题及其修复策略 目录 深入解析Windows Edge兼容性问题及其修复策略 一、引言 二、Windows Edge浏览器概述 三、深入分析兼容性问题 四、案例研究 五、技术解决方案与最佳实践 六、数据图表与性能指标 七、编程技巧与代码示例 一、引言 随着W…

Radash一款JavaScript最新的实用工具库,Lodash的平替!

文章目录 Lodash 的痛点进入正题--Radash特点 举例几个常用的api 一说lodash应该大部分前端同学都知道吧&#xff0c;陪伴我们好多年的JavaScript工具库&#xff0c;但是自从 ES6 出现后就慢慢退出前端人的视线&#xff0c;能ES6写的代码绝对不会用Lodash&#xff0c;也不是完全…

基于STC12C5A60S2系列1T 8051单片机的一个按键长按开关机后一个按键单击长按都增加数值另一个按键单击长按都减少数值应用

基于STC12C5A60S2系列1T 8051单片机的一个按键长按开关机后一个按键单击长按都增加数值另一个按键单击长按都减少数值应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介…

深入理解Java接口:定义、使用与重要性(day13)

导语&#xff1a;Java接口是Java编程语言中的一个核心概念&#xff0c;它提供了一种定义方法但不包含方法实现的方式。接口在Java编程中扮演着重要角色&#xff0c;能够帮助我们实现代码的高内聚、低耦合&#xff0c;提高代码的复用性和可维护性。本文将详细介绍Java接口的定义…