数据结构--数组类之DynamicArray类
来源:互联网 发布:scrollreveal.js 编辑:程序博客网 时间:2024/06/08 03:57
上一篇我们实现了Array的子类:StaticArray类,今天我们实现Array的另一个子类:DynamicArray类。
DynamicArray类的设计要点:
用类模板实现。
继承自Array类。
动态确定内部数组空间的大小。
实现返回数组长度的函数。
实现拷贝构造和赋值操作功能。
对重复逻辑进行优化。
下面是DynamicArray类的声明:
template <typename T> class DynamicArray : public Array<T> { protected: int m_length; T* copy(T* array, int len, int newlen);//新申请一个数组,并将原先数组内容拷贝至新空间。 void update(T* array, int length);//更新数组指向和大小 void init(T* array,int length);//对数组初始化,赋予空间和长度 public: DynamicArray(int length); DynamicArray(const DynamicArray<T>& obj); DynamicArray<T>& operator =(const DynamicArray<T>& obj); int length() const; void resize(int length); ~DynamicArray(); };
将代码出现的重复逻辑抽象成类的保护成员,供公有成员调用。
其中:
init作用:对象构造时的初始化操作
copy作用:在堆空间申请新的内存,并执行拷贝构造操作
update作用:将指定的堆空间作为内部存储数组使用,实现上保证了异常安全
将重复代码进行抽象后使得程序结构清晰,每个函数的功能十分明确。
下面是DynamicArray的完整实现。
template <typename T> class DynamicArray : public Array<T> { protected: int m_length; T* copy(T* array, int len, int newlen)//新申请一个数组,进行数组拷贝 { T* ret = new T[newlen]; if(ret != NULL) { int size = (len < newlen) ? len : newlen; for(int i = 0; i < size; i++) { ret[i] = array[i]; } } return ret; } void update(T* array, int length) { if(array != NULL) { T* temp = this->m_array; this->m_array = array; this->m_length = length; delete [] temp; } else { THROW_EXCEPTION(NoEnoughMemoryException,"No memory to update DynamicArray object..."); } } void init(T* array,int length) { if(array != NULL) { this->m_array = array; this->m_length = length; } else { THROW_EXCEPTION(NoEnoughMemoryException,"No memory to create DynamicArray object..."); } } public: DynamicArray(int length) { init(new T[length],length); } DynamicArray(const DynamicArray<T>& obj) { init(copy(obj.m_array,obj.m_length,obj.m_length),obj.m_length); } DynamicArray<T>& operator =(const DynamicArray<T>& obj) { if(this != &obj) { //将obj的内容复制出来 update(copy(obj.m_array,obj.m_length,obj.m_length),obj.m_length); } return *this; } int length() const { return m_length; } void resize(int length) { if(length != m_length) { //将this的内容复制出来 update(copy(this->m_array,m_length,length),length); } } ~DynamicArray() { delete [] this->m_array; } };
DynamicArray数组类优势在于可以动态指定数组长度使用resize函数,数组对象能够代替原生数组,使用上也更安全。
阅读全文
0 0
- 数据结构--数组类之DynamicArray类
- 数组类—DynamicArray
- C++ 数组模板类的实现 DynamicArray
- C++ Builder中的System::DynamicArray动态数组
- 数据结构--数组类之StaticArray类
- 数据结构之动态数组 (C++类模板实现)
- 数据结构之 栈stack 模板类(数组描述方法)
- 数据结构之后缀数组
- 数据结构之树状数组
- 数据结构之后缀数组
- 数据结构之树状数组
- 数据结构之树状数组
- 数据结构之数组
- 数据结构之树状数组
- 数据结构之数组
- 数据结构之树状数组
- 数据结构之数组
- 数据结构之数组
- petalinux2017.3新建工程并查看petalinux内核版本
- 关于linux 相互ping通访问不到nginx主页的问题
- http://www.jianshu.com/p/55458caf0814
- wpa_supplicant下行接口
- Publisher的消息确认机制
- 数据结构--数组类之DynamicArray类
- 一键配置Java环境(Android,Appium,python等)
- 最真实的幕后花絮,你不得不看的彩蛋都在这里了丨T-EDGE 2017
- 第十五周项目1
- 北京出台首个无人驾驶新规;余承东称华为明年进军美国;欧盟要求比特币实名交易丨价值早报
- 创投日报:12月18日收录投融资项目14起
- 2017 BTAwards「潜在价值」榜单揭榜丨T-EDGE 2017
- 说话就是生产力-孙路弘讲课笔记
- [代码块]记录