之前实现了java的动态数组,试着写了个C++版的,同样对时间复杂度振荡进行了处理。纯手打,代码如下 :

//
// Created by PC-Saw on 2018/12/19.
//#ifndef DATA_STRUCTURE_MYARRAY_H
#define DATA_STRUCTURE_MYARRAY_H#include <iostream>using namespace std;template <typename T>
class MyArray {
private:int mSize;int mCapacity;T*  data;
public:MyArray();                                  // 无参构造函数explicit MyArray(int Capacity);             // 构造函数,传入容量CapacityMyArray(const MyArray& arr);                // 拷贝构造MyArray &operator= (MyArray arr);           // 重载赋值操作符T &operator[](int index);                   // 重载[]操作赋~MyArray();                                 // 析构函数//友元函数实现 重载输出 << 操作符friend ostream & operator << (ostream &out, MyArray<T> &obj){out << "MyArray size = " << obj.mSize << ", Capacity = " << obj.mCapacity << endl;out << "MyArray: [";for (int i = 0; i < obj.mSize; ++i){out << obj.data[i];if (i != obj.mSize - 1)out << ", ";}out << "] ";return out;}//友元函数实现 输入 >> 操作符friend istream & operator >> (istream &in, MyArray<T> &obj){for (int i = 0; i < obj.mSize; ++i) {in << obj.data[i];}if (!in){obj = new MyArray();}return in;}bool isEmpty();                             // 判断数组是否为空bool isFull();                              // 判断数组是否已满int  find(T t);                             // 查找元素 t 的下标bool contain(T t);                          // 判断是否包含元素 tint  getSize();                             // 获取数组元素个数int  getCapacity();                         // 获取数组容量void pushFront(T t);                        // 头部添加元素void pushBack(T t);                         // 尾部添加元素void insert(int index, T t);                // 在指定位置插入元素 tT    remove(int index);                     // 删除指定位元素T    removeFront();                         // 删除第一个元素T    removeBack();                          // 删除最后一个元素void removeElement(T t);                    // 删除元素 tvoid set(int index, T t);                   // 将指定位置元素设为 tT    get(int index);                        // 查看 index 位置的元素T    getBack();                             // 返回最后一个元素void resize(int newCapacity);               // 重新分配空间
};// 构造函数
template <typename T>
MyArray<T>::MyArray(int Capacity)
{cout << "调用 MyArray(int) 构造 " << endl;if (Capacity <= 0)throw "传入容量有误!";mSize     = 0;mCapacity = Capacity;data      = new T[Capacity];
};// 无参构造函数
template <typename T>
MyArray<T>::MyArray()
{cout << "调用 MyArray() 构造 " << endl;mSize     = 0;mCapacity = 10;data      = new T[10];
};// 拷贝构造
template <typename T>
MyArray<T>::MyArray(const MyArray<T>& arr)
{cout << "调用拷贝构造 " << endl;this->mSize     = arr.mSize;this->mCapacity = arr.mCapacity;this->data      = new T[arr.mCapacity];// 拷贝数据for (int i = 0; i < arr.mSize; ++i) {this->data[i] = arr.data[i];}
}// 重载赋值操作符
template <typename T>
MyArray<T> &MyArray<T>::operator= (const MyArray<T> arr)
{cout << "调用 = 赋值操作 " << endl;if (this->data != NULL){delete[] this->data;this->data = NULL;}//分配内存this->mSize     = arr.mSize;this->mCapacity = arr.mCapacity;this->data      = new T[arr.mCapacity];//拷贝数据for(int i = 0; i < this->mSize; i++){//如果是自定义的复杂数据类型,必须对 = 运算赋进行重载,  operator=this->data[i] = arr.data[i];}return *this;
}// 重载[]操作赋
template <typename T>
T &MyArray<T>::operator[](int index)
{if (index < 0 || index > this->mSize - 1)throw "索引非法!";return this->data[index];
}// 析构函数
template <typename T>
MyArray<T>::~MyArray()
{cout << "调用析构函数 " << endl;if (this->data != NULL){delete[] this->data;this->data  = NULL;}this->mSize     = 0;this->mCapacity = 0;
}// 判断数组是否为空
template <typename T>
bool MyArray<T>::isEmpty()
{return mSize == 0;
};// 判断数组是否已满
template <typename T>
bool MyArray<T>::isFull()
{return mSize == mCapacity;
};// 查找元素 t 的下标
template <typename T>
int  MyArray<T>::find(T t)
{for (int i = 0; i < mSize; ++i){if (data[i] == t)return i;}return -1;
}// 查找是否包含元素 t
template <typename T>
bool MyArray<T>::contain(T t)
{return (find(t) != -1);
}// 获取数组元素个数
template <typename T>
int  MyArray<T>::getSize()
{return mSize;
}// 获取数组容量
template <typename T>
int  MyArray<T>::getCapacity()
{return mCapacity;
}// 头部添加元素
template <typename T>
void MyArray<T>::pushFront(T t)
{insert(0, t);
}// 尾部添加元素
template <typename T>
void MyArray<T>::pushBack(T t)
{insert(mSize, t);
}// 在指定位置插入元素 t
template <typename T>
void MyArray<T>::insert(int index, T t)
{if (index < 0 || index > mSize) // 判断下标是否有误throw 0;if (isFull())                   // 数组已满则重新分配空间resize(2 * mCapacity);for (int i = mSize; i > index ; --i){data[i] = data[i - 1];}data[index] = t;mSize++;
}// 删除指定位元素
template <typename T>
T MyArray<T>::remove(int index)
{if (index < 0 || index >= mSize)                    // 判断下标是否合法throw 0;// 删除 index 位置的元素并返回T ret = data[index];for (int i = index; i < mSize - 1; ++i) {data[i] = data[i + 1];}mSize--;if (mSize == mCapacity / 4 && mCapacity / 2 != 0)   // 空闲空间太大,重新分配空间resize(mCapacity / 2);return ret;
}// 删除第一个元素
template <typename T>
T MyArray<T>::removeFront()
{return remove(0);
}// 删除最后一个元素
template <typename T>
T MyArray<T>::removeBack()
{return remove(mSize - 1);
}// 删除元素 e
template <typename T>
void MyArray<T>::removeElement(T t)
{int index = find(t);index != -1 && remove(index);
}// 将制定位置元素设为 t
template <typename T>
void MyArray<T>::set(int index, T t)
{if (index < 0 || index >= mSize)throw 0;data[index] = t;
}// 返回 index 位置的元素
template <typename T>
T MyArray<T>::get(int index)
{if (index < 0 || index >= mSize)throw "index is illegal!";return data[index];
}// 返回最后一个元素
template <typename T>
T MyArray<T>::getBack()
{return get(mSize - 1);
}// 重新分配空间
template <typename T>
void MyArray<T>::resize(int newCapacity)
{if (newCapacity <= 0)throw 0;T* tmp = new T[newCapacity];for (int i = 0; i < mSize; ++i){tmp[i] = data[i];}delete[] data;data = tmp;mCapacity = newCapacity;
}#endif //DATA_STRUCTURE_MYARRAY_H

测试代码:

#include <iostream>
#include "MyArray.h"using namespace std;int main()
{//cout << boolalpha;        // 将bool值正常显示MyArray<int> arr;           for(int i = 0; i < 10; ++i) arr.pushBack(i);cout << arr << endl;arr.pushFront(100);cout << arr << endl;arr.pushFront(-1);cout << arr << endl;arr.remove(2);cout << arr << endl;arr.removeElement(4);cout << arr << endl;arr.removeFront();cout << arr << endl;for(int i = 0; i < 5; ++i){arr.removeBack();cout << arr << endl;}return 0;
}

之后还会有其他数据结构的 java 和 C++ 实现。

基于java的数据结构学习——动态数组C++类模板(含拷贝构造,重载常见运算符)相关推荐

  1. 基于java的数据结构学习——数组实现的栈以及简单应用C++实现

    基于java的数据结构学习--数组实现的栈以及简单应用的 C++ 实现 源码: // // Created by PC-Saw on 2019/1/3. //#ifndef DATA_STRUCTUR ...

  2. 基于java的数据结构学习——泛型动态数组的封装

    public class Array<E> {private E[] data;private int size;// 构造函数public Array(int Capacity){dat ...

  3. 基于java的数据结构学习——数组实现的队列和循环队列及性能对比

    队列 Queue 队列也是一种线性结构 相比数组,队列对应的操作是数组的子集 只能从一端(队尾)添加元素,只能从另一端(队首)取出元素 队列是一种先进先出的数据结构 队列的实现及复杂度分析 Queue ...

  4. 基于java的数据结构学习——数组实现的栈以及简单应用

    栈 Stack 栈是一种线性结构 相比数组,栈对应的操作是数组的子集 只能从一端添加元素,也只能从一端取出元素 这一端称为栈顶 栈是一种后进先出的数据结构 栈的应用 无处不在的Undo操作(撤销) 括 ...

  5. 基于Java毕业设计在线学习平台源码+系统+mysql+lw文档+部署软件

    基于Java毕业设计在线学习平台源码+系统+mysql+lw文档+部署软件 基于Java毕业设计在线学习平台源码+系统+mysql+lw文档+部署软件 本源码技术栈: 项目架构:B/S架构 开发语言: ...

  6. 基于java的婚恋交友动态网站

    "网络红娘"的出现不仅对传统交友方式和恋爱观形成强烈冲击,更形成了一门具有良好发展前景的新兴产业.与欧美国家相比,我国婚恋网站起步较晚,目前仍处于跑马圈地的群雄纷争时代,一家独大的 ...

  7. 基于JAVA计算机在线学习管理系统-计算机毕业设计源码+系统+mysql数据库+lw文档+部署

    基于JAVA计算机在线学习管理系统-计算机毕业设计源码+系统+mysql数据库+lw文档+部署 基于JAVA计算机在线学习管理系统-计算机毕业设计源码+系统+mysql数据库+lw文档+部署 本源码技 ...

  8. 基于JAVA英语课程学习网站计算机毕业设计源码+系统+mysql数据库+lw文档+部署

    基于JAVA英语课程学习网站计算机毕业设计源码+系统+mysql数据库+lw文档+部署 基于JAVA英语课程学习网站计算机毕业设计源码+系统+mysql数据库+lw文档+部署 本源码技术栈: 项目架构 ...

  9. 基于Java毕业设计在线学习系统源码+系统+mysql+lw文档+部署软件

    基于Java毕业设计在线学习系统源码+系统+mysql+lw文档+部署软件 基于Java毕业设计在线学习系统源码+系统+mysql+lw文档+部署软件 本源码技术栈: 项目架构:B/S架构 开发语言: ...

最新文章

  1. CentOS6.4 利用sendEmail发邮件
  2. python之sys模块详解
  3. UVA 536——Tree Recovery
  4. python新手输出错误,Python 新手常犯错误(第一部分)
  5. mysql主从复制的流程_MYSQL主从复制部署流程
  6. 【翻译】BCGControlBar Professional Edition for MFC v 29.0重大更新
  7. 杜比音效卡刷包android 7.0,杜比音效7.0清爽卡刷包-杜比音效7.0定制版v2.1.0 安卓版-手机腾牛网...
  8. Spring注解原理的详细剖析与实现
  9. UI设计师的段位和匹配能力
  10. Kotlin - 面向对象之抽象类与接口
  11. 暴力破解:破解强力保护、IP 封锁(连续提交 3 次错误登录封IP 的情况下)
  12. 24点游戏(随机产生四个不同的1到13的随机数据外加加减乘除构成表达式,输出结果等于24的表达式)
  13. JS复制文本到粘贴板,前端H5移动端点击按钮复制文本到粘贴板。
  14. linux批处理模式,巧用linux-top的批处理模式
  15. 生物工程毕业的他,如何成为年薪超40w的Java程序员
  16. Linux自动挂载模块目录,LINUX modprobe命令-自动处理可载入模块
  17. Jzoj3547 MEX
  18. vue2进阶篇:vue-router之“使用独享路由守卫”
  19. svn 插件选择 Subclipse与Subversive比较
  20. VHDL 属性语句之attribute 和keep

热门文章

  1. 链表c语言stl,C++STL之List容器
  2. php的mcypt,php 7.3 在Centos6.x下的安装过程
  3. 7 centos 查看程序文件数量_「动手打造家庭媒体网络平台」安装篇-centos搭建DLNA媒体服务...
  4. 剑指offer:12-17记录
  5. 终于,我读懂了所有Java集合——List篇
  6. 炸窝(Collections当中的addAll方法)
  7. C++(STL):05---智能指针之unique_ptr
  8. lua与C++粘合层框架
  9. 数据结构和算法(02)---字符串(c++)
  10. 《Python Cookbook 3rd》笔记(2.4):字符串匹配和搜索