前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数组类模板(类模拟实现静态数组)(简单版)

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

作者头像
用户11039529
发布2024-04-02 08:45:23
680
发布2024-04-02 08:45:23
举报
文章被收录于专栏:算法学习日常算法学习日常

介绍:

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

进阶版在这篇文章哦:数组类模板(进阶版)-CSDN博客

不过先看完本篇文章才对进阶文章理解哦

案例描述:

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

思路:

对要求分别分析实现:

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

创建对应的类:

1.定义一个数组类
代码语言:javascript
复制
class myArr
{
public:

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

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

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

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

代码语言:javascript
复制
class myArr
{
public:

private:
	elemtype* arr;
	int myCapacity;
	int mySize;
};
3.数组函数有:
构造函数(容量)
代码语言:javascript
复制
	myArr(int Capacity)
	{
		myCapacity = Capacity;/**/
		mySize = 0;/**/

		arr = new elemtype[Capacity];/*注意不可直接定义,要在堆区上new一块空间*/
	}
拷贝构造---->operator=(重载 = )
代码语言:javascript
复制
	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];
		}
	}
尾插法
代码语言:javascript
复制
    void endInsert(int e)
	{
		if (mySize > myCapacity)
		{//模仿数组越界时的报错(直接终止程序)
			cout << "数组元素过多,超过容量,增加失败" << endl;
			exit(0);//终止程序(比return结束程序更彻底,return是返回上一层结果,而exit直接停止程序)
		}
		arr[mySize] = e;
		mySize++;
	}

若调用的是如下代码:

代码语言:javascript
复制
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个,发生了越界,因此会报错:

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

尾删法
代码语言:javascript
复制
	void endDelete()
	{
		mySize--;
	}
获取数组容量
代码语言:javascript
复制
	int getCapacity()
	{
		return myCapacity;
	}
获取数组大小
代码语言:javascript
复制
	int getSize()
	{
		return mySize;
	}
析构函数
代码语言:javascript
复制
    ~myArr()
	{
		// delete arr[];//错误写法
		delete[] arr;//delete要提前知道释放的是数组

		myCapacity = 0;
		mySize = 0;
	}

总代码:

代码语言:javascript
复制
				/*数组类模板*/


//类模板案例
//案例描述:实现一个通用的数组类,要求如下:
//
//.可以对内置数据类型以及自定义数据类型的数据进行存储 ------ 将数组的数据类型设置为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;
}

效果展示:

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-03-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍:
  • 案例描述:
  • 思路:
    • 对要求分别分析实现:
      • 创建对应的类:
        • 1.定义一个数组类
        • 2.类中属性有:数组, 容量, 大小
        • 3.数组函数有:
    • 总代码:
      • 效果展示:
      相关产品与服务
      数据保险箱
      数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档