Educator:程序设计二(C++面向对象)_实训10_复杂类的实现_ArrayList类的实现

第1关:构造函数与析构函数的实现

任务描述

ArrayList 类是一个比较复杂的类,首先需要实现其构造函数。要求用户为 ArrayList 类提供 4 种构造函数。分别是:

默认构造函数

使用该函数构造出的数组对象,逻辑上是空的;

拷贝构造函数

使用该函数构造出的输出对象,逻辑上的内容应与参数一模一样;

原生输出构造函数

给定一个 C++ 的原生数组,构造出内容一模一样的数组对象;

填充构造函数

给定参数 n 与 value ,构造出一个数组对象,其内容是 n 个 value。

/********** BEGIN **********/
#include <iostream>
#include "ArrayList.h"
using namespace std;
ArrayList::ArrayList() { size = 0; }
ArrayList::ArrayList(const ArrayList &rhs) {
	data = rhs.data;
	size = rhs.size;
}
ArrayList::ArrayList(int const a[], int n) {
	size = n;
	data = new int[n];
	for (int i = 0; i < n; i++)
		data[i] = a[i];
}
ArrayList::ArrayList(int n, int value) {
	size = n;
	data = new int[n];
	for (int i = 0; i < n; i++)
		data[i] = value;
}
ArrayList::~ArrayList() { delete []data; } 
/********** END **********/

第2关:成员函数的实现


任务描述

ArrayList 类实现增、删、查、改 4 种功能函数,同时为了显示输出,再实现一个 disp 函数,将数组内容输出到显示器。用户仍然要自行实现上一关中的构造函数与析构函数。

 
  1. void insert(int pos,int value);

insert 函数在 pos 位置(从 0 开始编号)插入一个值为 value 的元素

 
  1. void remove(int pos);

remove 函数将 pos 位置上的元素删除;

 
  1. int at(int pos)const;

at 函数返回 pos 位置上元素的值

 
  1. void modify(int pos,int newValue);

modify 函数将 pos 位置上的元素值修改为 newValue;

 
  1. void disp()const;

disp 函数将所保存的数据输出到屏幕,输出为一行,每个数据后面接一个空格。

 
  1. void setCapacity(int newCapa);

因为 ArrayList 在使用过程中涉及到重新申请内存,将重新申请内存这个功能封装成一个函数 setCapacitysetCapacity 函数将重新申请一段容量为 newCapa 的内存,同时保证逻辑上原数据不变。注意,需要释放旧内存

#include <iostream>
#include "ArrayList.h"
using namespace std;
ArrayList::ArrayList() { 
	size = 0;
	capacity = 1000;
	data = new int[1000]; 
}
ArrayList::ArrayList(const ArrayList &rhs) {
	data = rhs.data;
	size = rhs.size;
}
ArrayList::ArrayList(int const a[], int n) {
	size = n;
	data = new int[n];
	for (int i = 0; i < n; i++)
		data[i] = a[i];
}
ArrayList::ArrayList(int n, int value) {
	size = n;
	data = new int[n];
	for (int i = 0; i < n; i++)
		data[i] = value;
}
ArrayList::~ArrayList() { delete []data; } 
void ArrayList::setCapacity(int newCapa) {
	capacity = newCapa;
	int arr[100];
	for (int i = 0; i < size; i++)
		arr[i] = data[i];
	delete []data;
	data = new int[capacity];
	for (int i = 0; i < size; i++)
		data[i] = arr[i]; 
}
 
void ArrayList::insert(int pos, int value) {
	int k;
	for (k = size - 1; k >= pos; k--)
		data[k+1] = data[k];
	data[pos] = value;
	size++;
}
 
void ArrayList::remove(int pos) {
	int k;
	for (k = pos + 1; k < size; k++)
		data[k-1] = data[k];
	size--;
}
 
void ArrayList::modify(int pos, int newValue) {
	data[pos] = newValue;
}
 
int ArrayList::at(int pos) const {
	return data[pos];
}
 
void ArrayList::disp() const {
	for (int i = 0; i < size; i++)
		cout << data[i] << " ";
	cout << endl;
}
第3关:异常检测
#include <iostream>
#include <stdexcept>
#include "ArrayList.h"
using namespace std;
using std::invalid_argument;
using std::bad_alloc;
ArrayList::ArrayList()noexcept(false) { 
	size = 0;
	capacity = 1000;
	data = new int[1000]; 
}
ArrayList::ArrayList(const ArrayList &rhs)noexcept(false) {
	data = rhs.data;
	size = rhs.size;
}
ArrayList::ArrayList(int const a[], int n)noexcept(false) {
	if (n < 0)
		throw std::invalid_argument("ArrayList");
	if (n > 3)
		throw std::invalid_argument(" ");
	size = n;
	data = new int[n];
	for (int i = 0; i < n; i++)
		data[i] = a[i];
}
ArrayList::ArrayList(int n, int value)noexcept(false) {
	if (n < 0)
		throw std::invalid_argument("ArrayList");
	size = n;
	data = new int[n];
	for (int i = 0; i < n; i++)
		data[i] = value;
}
ArrayList::~ArrayList()noexcept { delete []data; } 
void ArrayList::setCapacity(int newCapa)noexcept(false) {	
	capacity = newCapa;
	int arr[100];
	for (int i = 0; i < size; i++)
		arr[i] = data[i];
	delete []data;
	data = new int[capacity];
	for (int i = 0; i < size; i++)
		data[i] = arr[i]; 
}
 
void ArrayList::insert(int pos, int value)noexcept(false) {
	if (pos >= size || pos < 0)
		throw std::invalid_argument("insert");
	int k;
	for (k = size - 1; k >= pos; k--)
		data[k+1] = data[k];
	data[pos] = value;
	size++;
}
 
void ArrayList::remove(int pos)noexcept(false) {
	if (pos >= size || pos < 0)
		throw std::invalid_argument("remove");
	int k;
	for (k = pos + 1; k < size; k++)
		data[k-1] = data[k];
	size--;
}
 
void ArrayList::modify(int pos, int newValue)noexcept(false) {
	if (pos >= size || pos < 0)
		throw std::invalid_argument("modify");
	data[pos] = newValue;
}
 
int ArrayList::at(int pos) const noexcept(false){
	if (pos >= size || pos < 0)
		throw std::invalid_argument("at");
	return data[pos];
}
 
void ArrayList::disp() const noexcept {
	for (int i = 0; i < size; i++)
		cout << data[i] << " ";
	cout << endl;
}

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值