T1469 ArrayList
题目描述
Rainy Memory 嫌弃 C++ 的数组很久了:不仅不会检查下标越界,也没有数组拼接、数组输出等方便的功能。学习了 OOP 知识的你,可不可以写一个类帮他解决这个问题呢?
你需要完成一个模板类 ArrayList
,有且仅有一个模板参数 T
,为数组中元素的类型。
这个类需要支持以下功能:
- 构造函数
- 从已有的数组构造:参数
T* arr, int length
,length
为arr
的长度 - 构造一个固定长度的数组:参数
int length
,其中的元素应调用其默认构造函数 - 拷贝构造函数(深拷贝,需要复制元素的值)
- 从已有的数组构造:参数
- 析构函数
- 成员函数
size()
,返回数组大小。 operator[]
的重载,支持通过[]
赋值与得到数组元素(需要同时完成左值与右值的重载)。operator+
的重载,拼接两个数组,原来的两个数组不应该改变。operator=
的重载,将本数组赋值为另一个数组,需要支持连续赋值。(同拷贝构造函数一样是深拷贝)operator==, !=
的重载,数组相同的判定条件是长度与对应位元素均相等。operator<<
的重载,格式为使用一个空格隔开数组中的所有元素,不输出换行符。- 在评测时,程序的任何输出都将通过调用
printList
函数来实现(见下方代码,略去了模板相关的内容)。因此,如果你没有完成operator<<
的重载,你也可以利用给定的print
函数并注释掉#define USE_OS
以使得评测能够正常进行,否则可能产生编译错误。print
函数同样按照格式输出到cout,不输出换行符。
- 在评测时,程序的任何输出都将通过调用
题面补充:如果你要测试 operator<<
的重载,需要在你提交的代码开头加上 #define USE_OS
void printList(ArrayList list) {
#ifdef USE_OSstd::cout << list << "\n";
#elselist.print();std::cout << "\n";
#endif
}
保证模板参数 T
有默认构造函数,支持 operator==, <<, =
。
同时需要在出现问题时抛出异常。我们提供以下异常类:
class error : public std::exception {
private:std::string msg;public:explicit error(const char *_msg_) : msg(_msg_) {}const char *toString() {return msg.c_str();}
};
可能出现的异常有:
- 下标越界:下标为
0-based
,若下标越界抛出index out of bound
- 初始化长度非法:若构造函数中
length < 0
,抛出invalid length
调用示例
#include "ArrayList.hpp"
...try {ArrayList<char> list_err(-1);} catch (error &e) {std::cout << e.toString() << std::endl;}ArrayList<int> list(5);try {list[-1];} catch (error &e) {std::cout << e.toString() << std::endl;}try {list[2000];} catch (error &e) {std::cout << e.toString() << std::endl;}for (int i = 0; i < list.size(); i++) list[i] = i;printList(list);ArrayList<int> temp = list;printList(temp);temp = list;printList(temp);if (temp == list) std::cout << "true" << std::endl;int arr[5] = {4, 215, 12, 84, 76};const ArrayList<int> list_const(arr, 5);std::cout << list_const[3] << std::endl;printList(list_const);printList(list_const + list);return 0;
...
样例输出
invalid length
index out of bound
index out of bound
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
true
84
4 215 12 84 76
4 215 12 84 76 0 1 2 3 4
输入格式
你不需要处理输入,可以参考上述调用示例。
输出格式
你不需要处理输出,可以参考上述调用示例。
数据范围
check point | 数据特征 |
---|---|
1 | 同调用样例 |
2 | 仅检测异常处理 |
3 | 鲁棒性 |
4 | 主要考察+,size |
5 | 流输出运算符重载 |
6 | 元素默认构造函数的调用 |
7 ~ 12 | 内容同上述1 ~ 6,检查内存泄漏,共20分 |
时空磁盘限制(运行时)
时间限制: 3000 ms
内存空间限制: 244 MiB
磁盘空间限制: 无限制
题目解答:
如果多次throw会导致Memory Leak 蛮难找的提交了七八次才凑出来
以及鲁棒性方面 =重载考虑自身不然delete自己再new会导致赋值不对WA
#include<iostream>
#include<cstdio>
#define USE_OSusing namespace std;
class error : public std::exception {private:std::string msg;public:explicit error(const char *_msg_) : msg(_msg_) {}const char *toString() {return msg.c_str();}
};template<typename T>
class ArrayList
{public:T *data;int length;ArrayList(T *arr, int len){if (len<0) throw error("invalid length");length=len;data=new T[length];int i;for (i=0;i<length;i++)data[i]=arr[i];}ArrayList(int len){if (len<0) throw error("invalid length");length=len;data=new T[length];}ArrayList(const ArrayList &b){if (b.length<0) throw error("invalid length");length=b.length;data=new T[length];int i;for (i=0;i<length;i++)data[i]=b.data[i];}~ArrayList(){length=0;delete []data;}int size(){if (length<0) throw error("invalid length");return this->length;}const T &operator[](int index) const{if (index>=this->length || index<0) throw error("index out of bound");return this->data[index];}T &operator[](int index){if (index>=this->length || index<0) throw error("index out of bound");return this->data[index];}bool operator==(const ArrayList &b){if (!(b.length==this->length)) return false;int i;for (i=0;i<this->length;i++)if (!(this->data[i]==b.data[i])) return false;return true;}bool operator!=(const ArrayList &b){if (!(b.length==this->length)) return true;int i;for (i=0;i<this->length;i++)if (!(this->data[i]==b.data[i])) return true;return false;}ArrayList &operator=(const ArrayList &a){int i;if (*this==a) return *this;delete []data;length=a.length;data=new T[a.length];for (i=0;i<a.length;i++) this->data[i]=a.data[i]; return *this;}
};
template<typename T>
ArrayList<T> operator+(const ArrayList<T> &a,const ArrayList<T> &b){ArrayList<T> t(a.length+b.length);int i;for (i=0;i<a.length;i++) t.data[i]=a.data[i];for (i=a.length;i<a.length+b.length;i++) t.data[i]=b.data[i-a.length];return t;}template<typename T>
ostream &operator <<(ostream &os, const ArrayList<T> &obj)
{int i;for (i=0;i<obj.length;i++) os<<obj.data[i]<<' ';return os;
}
T1469 ArrayList相关推荐
- Java List与ArrayList 的区别(List list =new Arraylist(); ArrayList<String> arrayList = new ArrayList())
一般想知道List 与ArrayList 的区别可能大部分都是看到了 List list = new ArrayList(); 和 ArrayList arrayList = new ArrayLis ...
- List 为什么可以实例化ArrayList
昨天我带的一个同事问我List 为什么可以实例化ArrayList,刚开始一下萌了(带了快 2个月了) 比如List list = new ArrayList(); List 是一个接口, 接口使用的 ...
- ArrayList源码学习
可增长数组结构 实现: 1. 内部采用数组的方式. 1.1 添加元素,会每次校验容量是否满足, 扩容规则是当前数组长度+当前数组长度的二分之一.容量上限是Integer.MAX_VALUE. copy ...
- 比较ArrayList、LinkedList、Vector
翻译人员: 铁锚 翻译时间: 2013年12月2日 原文链接: ArrayList vs. LinkedList vs. Vector 1. List概述 List,就如图名字所示一样,是元素的有序列 ...
- 3月7日 ArrayList集合
ArrayList与数组的区别: 数组是连续的.同一类型数据的一块区域,而集合可以是不连续的.多种数据类型的. 1.ArrayList ArrayList al = new ArrayList(); ...
- 转 java c++互传arraylist
Java JNI由浅入深(包括:Java和C++互传ArrayList泛型对象参数) 2010-11-25 09:57 1694人阅读 评论(1) 收藏 举报 我们知道Java是一个运行在虚拟机里面的 ...
- List and ArrayList
List<> and ArrayList Class Diagrams Using the Bit Complement of the BinarySearch() Result 代码 ...
- java arraylist和list_Java中ArrayList和LinkedList区别
原文链接:http://pengcqu.iteye.com/blog/502676 一般大家都知道ArrayList和LinkedList的大致区别: 1.ArrayList是实现了基于动态数组的数据 ...
- Java 集合框架(二)—— ArrayList
二.数组列表 -- ArrayList 1.构造方法 ArrayList 是 Java 中的动态数组,底层实现就是对象数组,只不过数组的容量会根据情况来改变. 它有个带 int 类型参数的构造方法,根 ...
最新文章
- Java、Android静态代理与动态代理
- UVALive 7040 Color
- 深度学习训练模型中的 train from scrath 是什么意思?(247)
- 两个具有相同的名称在CLASSPATH中的类
- python抠透明图_python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
- 信号完整性分析大作业_Matplotlib数据可视化 amp; Pandas数据分析 综合实训大作业...
- 左侧侧拉栏html,html – 将侧边栏拉伸到页面的完整高度
- Java架构学习(三十三)ActivityMQ基础消息中间件概述异步与同步MQ作用MQ件通讯方式MQ应用场景ActivityMQ安装使用ActivityMQ的案例主题和订阅
- html怎么置顶导航栏,css怎么实现滚动页面导航栏固定在顶部
- 产品经理的素质能力模型
- 22-LTE Policy and Charging Control (PCC)
- Ubuntu16.04编译roc-rk3328-cc
- PAMTRI:用于车辆重新识别的姿势感知多任务学习
- 设计模式学习难度系数排名
- DELL 服务器 PCI-E 6IR 通道卡 6I阵列卡8口SAS SATA (整理)
- Linux07_文件操作
- 《左耳听风-高效学习篇》阅读笔记
- MySQL学习笔记(四)
- AV1和开放媒体联盟(AOM)的发展、成果与未来
- 计算机房挨着音乐教室用英语怎么说,四年级下册英语期末复习资料