基于java的数据结构学习——动态数组C++类模板(含拷贝构造,重载常见运算符)
之前实现了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++类模板(含拷贝构造,重载常见运算符)相关推荐
- 基于java的数据结构学习——数组实现的栈以及简单应用C++实现
基于java的数据结构学习--数组实现的栈以及简单应用的 C++ 实现 源码: // // Created by PC-Saw on 2019/1/3. //#ifndef DATA_STRUCTUR ...
- 基于java的数据结构学习——泛型动态数组的封装
public class Array<E> {private E[] data;private int size;// 构造函数public Array(int Capacity){dat ...
- 基于java的数据结构学习——数组实现的队列和循环队列及性能对比
队列 Queue 队列也是一种线性结构 相比数组,队列对应的操作是数组的子集 只能从一端(队尾)添加元素,只能从另一端(队首)取出元素 队列是一种先进先出的数据结构 队列的实现及复杂度分析 Queue ...
- 基于java的数据结构学习——数组实现的栈以及简单应用
栈 Stack 栈是一种线性结构 相比数组,栈对应的操作是数组的子集 只能从一端添加元素,也只能从一端取出元素 这一端称为栈顶 栈是一种后进先出的数据结构 栈的应用 无处不在的Undo操作(撤销) 括 ...
- 基于Java毕业设计在线学习平台源码+系统+mysql+lw文档+部署软件
基于Java毕业设计在线学习平台源码+系统+mysql+lw文档+部署软件 基于Java毕业设计在线学习平台源码+系统+mysql+lw文档+部署软件 本源码技术栈: 项目架构:B/S架构 开发语言: ...
- 基于java的婚恋交友动态网站
"网络红娘"的出现不仅对传统交友方式和恋爱观形成强烈冲击,更形成了一门具有良好发展前景的新兴产业.与欧美国家相比,我国婚恋网站起步较晚,目前仍处于跑马圈地的群雄纷争时代,一家独大的 ...
- 基于JAVA计算机在线学习管理系统-计算机毕业设计源码+系统+mysql数据库+lw文档+部署
基于JAVA计算机在线学习管理系统-计算机毕业设计源码+系统+mysql数据库+lw文档+部署 基于JAVA计算机在线学习管理系统-计算机毕业设计源码+系统+mysql数据库+lw文档+部署 本源码技 ...
- 基于JAVA英语课程学习网站计算机毕业设计源码+系统+mysql数据库+lw文档+部署
基于JAVA英语课程学习网站计算机毕业设计源码+系统+mysql数据库+lw文档+部署 基于JAVA英语课程学习网站计算机毕业设计源码+系统+mysql数据库+lw文档+部署 本源码技术栈: 项目架构 ...
- 基于Java毕业设计在线学习系统源码+系统+mysql+lw文档+部署软件
基于Java毕业设计在线学习系统源码+系统+mysql+lw文档+部署软件 基于Java毕业设计在线学习系统源码+系统+mysql+lw文档+部署软件 本源码技术栈: 项目架构:B/S架构 开发语言: ...
最新文章
- CentOS6.4 利用sendEmail发邮件
- python之sys模块详解
- UVA 536——Tree Recovery
- python新手输出错误,Python 新手常犯错误(第一部分)
- mysql主从复制的流程_MYSQL主从复制部署流程
- 【翻译】BCGControlBar Professional Edition for MFC v 29.0重大更新
- 杜比音效卡刷包android 7.0,杜比音效7.0清爽卡刷包-杜比音效7.0定制版v2.1.0 安卓版-手机腾牛网...
- Spring注解原理的详细剖析与实现
- UI设计师的段位和匹配能力
- Kotlin - 面向对象之抽象类与接口
- 暴力破解:破解强力保护、IP 封锁(连续提交 3 次错误登录封IP 的情况下)
- 24点游戏(随机产生四个不同的1到13的随机数据外加加减乘除构成表达式,输出结果等于24的表达式)
- JS复制文本到粘贴板,前端H5移动端点击按钮复制文本到粘贴板。
- linux批处理模式,巧用linux-top的批处理模式
- 生物工程毕业的他,如何成为年薪超40w的Java程序员
- Linux自动挂载模块目录,LINUX modprobe命令-自动处理可载入模块
- Jzoj3547 MEX
- vue2进阶篇:vue-router之“使用独享路由守卫”
- svn 插件选择 Subclipse与Subversive比较
- VHDL 属性语句之attribute 和keep
热门文章
- 链表c语言stl,C++STL之List容器
- php的mcypt,php 7.3 在Centos6.x下的安装过程
- 7 centos 查看程序文件数量_「动手打造家庭媒体网络平台」安装篇-centos搭建DLNA媒体服务...
- 剑指offer:12-17记录
- 终于,我读懂了所有Java集合——List篇
- 炸窝(Collections当中的addAll方法)
- C++(STL):05---智能指针之unique_ptr
- lua与C++粘合层框架
- 数据结构和算法(02)---字符串(c++)
- 《Python Cookbook 3rd》笔记(2.4):字符串匹配和搜索