用类模板实现的【动态数组模板】

动态数组模板的特点:

  1. 自动扩容。构造函数里初始化的长度为10,数组被填满时会自动扩容,保留数据不变的前提下重新分配地址长度。
  2. 任何数据类型的数组都可以创建,前提是注意打印输出的格式,尤其是自定义的class类型,需要重载"<<"符号。参考例程中的Point。
  3. 实现功能:增,删,查,打印。
    add(int dat):向数组插入一个数据
    get(int index):按照索引(下标)获取数组中的数据
    size():得到数组的大小
    travel():把数组打印一遍
    remove(int index):按照索引(下标)删除数组中的数据
//动态数组-类模板
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>

using namespace std;

//自定义一个类:点。类内重载了"<<"符号,方便打印输出。
class Point {
public:
	Point() {
	}
	Point(int x, int y) :
			x(x), y(y) {
	}
	Point(Point& p) {
		this->x = p.x;
		this->y = p.y;
	}
	void show() {
		printf("Point[x=%d, y=%d]", x, y);
	}
	friend ostream& operator<<(ostream& os, const Point& p);
private:
	int x, y;
};
ostream& operator<<(ostream& os, const Point& p) {  //重载“<<”号
	os << "Point[x=" << p.x << ", y=" << p.y << "]";
	return os;
}

//动态数组模板基(父)类,可以不写
template<typename T>
class List {
public:
	virtual void add(T dat) = 0; //向数组插入一个数据
	virtual T get(int index) = 0; //按照索引(下标)获取数组中的数据
	virtual int size() = 0; //得到数组的大小
	virtual void travel() = 0; //把数组打印一遍
	virtual int remove(int index) = 0; //按照索引(下标)删除数组中的数据

	virtual ~List() {
	}
};

//动态数组模板的派生(子)类,继承基类
template<typename T>
class ArrayList: public List<T> {
public:
	ArrayList() {
		len = 10;
		arr_Size = 0;
		this->arr = new T[len];
	}
	~ArrayList() {
		delete[] arr;
	}
	void add(T dat) {
		*(arr + arr_Size) = dat;
		arr_Size++;
		if (arr_Size >= len) {
			arr_Expansion();
		}
	}
	int size() {
		return arr_Size;
	}
	void travel() {
		int i = 0;
		printf(
				"============================================================================\n");
		printf("arr_Size:%d\n", arr_Size);
		for (; i < arr_Size; i++) {
			cout << *(arr + i) << "\t";
			if (i % 10 == 9) {
				printf("\n");
			}
		}
		printf("\n");
		printf(
				"============================================================================\n");
	}

	T get(int index) {  //要加一个index在0~arr_Size之间的判断,不在就是越界,return -1
		if (index < 0 || index > arr_Size) {
			printf("越界\n");
			//return -1;
		}
		return *(arr + index);
	}
	int remove(int index) { //要加一个index在0~arr_Size之间的判断,不在就是越界,return -1
		if (index < 0 || index > arr_Size) {
			printf("越界\n");
			return -1;
		}
		for (int i = index; i < arr_Size; i++) {
			if (index == arr_Size) {
				//*(arr + arr_Size) = '\0';
			}
			*(arr + i) = *(arr + i + 1);
		}
		arr_Size--;
		printf("It is successful to remove!\n");
		return 1;
	}
private:
	int len;
	int arr_Size;
	T* arr;

	void arr_Expansion() {
		T* arr1 = arr;
		len += 10;
		arr = new T[len];
		for (int i = 0; i < len; i++) {
			*(arr + i) = *(arr1 + i);
		}
		delete[] arr1;
	}
};

int main() {
	ArrayList<int> list1; //int型数组
	for (int i = 1; i <= 100; i++) {
		list1.add(i);
	}
	list1.travel();

	ArrayList<double> list2; //double型数组
	for (int i = 1; i <= 100; i++) {
		list2.add(0.01 * i);
	}
	list2.travel();

	ArrayList<char> list3; //char型数组
	for (int i = 32; i <= 100; i++) {
		list3.add(i);
	}
	list3.travel();

	Point p;
	ArrayList<Point> list4;  //自定义类Point型数组
	for (int i = 1; i <= 100; i++) {
		p = Point(i, i);
		list4.add(p);  //list4.add(Point(i, i))的方式不行,用p过渡一下
	}
	list4.travel();
}
	cout << list4.get(50) << endl;

运行结果(Eclipse):
list1、list2
在这里插入图片描述list3、lit4
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值