动态数组(int型、整型),可自动扩容

如果直接定义一个数组,数组初始化后的长度是固定的,存入的数据数量有限,无法扩容存入更多数据。
利用C++的抽象类可实现可扩容的动态数组。功能:

  1. add(int dat):向数组插入一个数据
  2. get(int index):按照索引(下标)获取数组中的数据
  3. size():得到数组的大小
  4. travel():把数组打印一遍
  5. remove(int index):按照索引(下标)删除数组中的数据
//可扩容的动态int型数组,例程:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>

using namespace std;
int count = 1;

class List {
public:
	virtual void add(int dat) = 0;
	virtual int get(int index) = 0;
	virtual int size() = 0;
	virtual void travel() = 0;
	virtual int remove(int index) = 0;

	virtual ~List() {
	}
	;
};

class ArrayList: public List {
public:
	ArrayList() {
		len = 10;
		arr_Size = 0;
		this->arr = new int[len];
		//printf("No.%d\tarr.addr=%p\n", count++, arr);

	}
	~ArrayList() {
		//printf("No.%d\tarr.addr=%p\n", count++, arr);
		delete[] arr;
	}
	void add(int 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++) {
			printf("%d\t", *(arr + i));
			if (i % 10 == 9) {
				printf("\n");
			}
		}
		printf("\n");
		printf(
				"============================================================================\n");
	}

	int get(int index) {
		return *(arr + index);
	}
	int remove(int index) {//要加一个index在0~arr_Size之间的判断,不在就是越界,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;
	int* arr;

	void arr_Expansion() {
		int* arr1 = arr;
		len += 10;
		arr = new int[len];
		for (int i = 0; i < len; i++) {
			*(arr + i) = *(arr1 + i);
		}
		delete[] arr1;
		printf("No.%d\tarr.addr=%p\n", count++, arr);
	}
};

int main() {
	ArrayList list;
	for (int i = 1; i <= 35; i++) {
		list.add(i);
	}
	list.travel();
	int index;
	printf("index:");
	scanf("%d", &index);
	printf("list[%d]=%d\n", index, list.get(index));
	
	printf("index to remove:");
	scanf("%d", &index);
	list.remove(index);
	list.travel();
}

运算结果(Eclipse):
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个示例代码,实现了上述要求。 ```c++ #include <iostream> using namespace std; class IntArray { private: int* data; int size; int capacity; public: IntArray(int initCapacity = 10) { data = new int[initCapacity]; size = 0; capacity = initCapacity; } ~IntArray() { delete[] data; } int& operator[](int index) { if (index < 0 || index >= size) { cout << "Error: Index out of range!" << endl; exit(1); } return data[index]; } void pushback(int value) { if (size == capacity) { int* newData = new int[capacity * 2]; for (int i = 0; i < size; i++) { newData[i] = data[i]; } delete[] data; data = newData; capacity *= 2; } data[size] = value; size++; } }; int main() { IntArray arr(5); arr.pushback(1); arr.pushback(2); arr.pushback(3); arr.pushback(4); arr.pushback(5); arr.pushback(6); cout << arr[0] << endl; cout << arr[5] << endl; // should output error message return 0; } ``` 下面是代码的解释: - `IntArray` 类包含三个私有成员变量:`data` 用于存储整数组的数据,`size` 表示数组的大小,`capacity` 表示数组的容量(即能够容纳的元素个数)。 - `IntArray` 类的构造函数可以接受一个初始容量参数,默认为 10。在构造函数中,我们使用 `new` 运算符为 `data` 分配内存空间,并将 `size` 和 `capacity` 初始化为 0 和初始容量。 - `IntArray` 类的析构函数用于释放 `data` 占用的内存空间,避免内存泄漏。 - `IntArray` 类重载了 `[]` 运算符,使得可以通过下标的形式访问数组元素。在 `[]` 运算符中,我们首先检查下标是否越界,如果越界则输出错误提示并退出程序;否则返回对应元素的引用。 - `IntArray` 类提供了 `pushback` 方法,用于在数组末尾插入一个元素。如果数组容量不足,会自动扩容,确保能够正确保存数据。在 `pushback` 方法中,我们首先检查数组是否已满,如果已满则分配一个容量为原来两倍的新数组,并将原数组中的元素拷贝到新数组中;然后将新元素插入到数组末尾,并将 `size` 加 1。 - 在 `main` 函数中,我们创建了一个初始容量为 5 的 `IntArray` 对象 `arr`,并通过 `pushback` 方法向其中插入了 6 个元素。然后我们通过 `[]` 运算符访问了数组中的元素,其中第二个访问操作越界,会输出错误提示信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值