基于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++ 实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/448033.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

科目三考试过程详解

科目三是考驾照的最后一项考试&#xff0c;所以考生在这关都很注意&#xff0c;但是有可能是由于过于紧张都难免会有些失误&#xff0c;如果没过的话&#xff0c;那也就意味着您拿照的时间又延长了另外还要交补考费。因此很多学员都想一次性把这项考试通过&#xff0c;那么我们…

图解 IDEA 中 springboot 项目 MyBatis Generator 逆向生成实体类及 mapper 配置文件

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、准备工作&#xff1a; 1. 新建一个 配置文件&#xff1a;generatorConfig.xml 。 <?xml version"1.0" encoding&qu…

关于IIS 7.5 限制连接数与流量限制模块

网页中的视频是用户喜闻乐见的常见形式之一&#xff0c;并在主要的站点中中以某种形式&#xff08;产品视频、教程视频、理财场景、user generated content、消费报告等&#xff09;在更广泛的应用。 其中的一个挑战是把视频加入到站点&#xff0c;虽然这并不花费很多代价。高质…

2014版学车考驾照精华攻略 总有一个你需要!赶紧收藏吧!!

新交规&#xff0c;新驾考&#xff0c;拿下本本&#xff0c;着实不容易。2013的你&#xff0c;是否已经踏上学车征程&#xff0c;为了顺利拿到本本而苦于八方搜索&#xff0c;四处奔波&#xff0c;一心只为获得有所帮助的经验之谈、简单易懂的学车攻略呢&#xff1f;本着锄强扶…

mybatis 逆向工程生成的 Example 类的使用

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一.逆向工程 逆向工程可以针对单表自动生成 mybatis 执行所需要的代码&#xff08;mapper.java,mapper.xml、po&#xff09;, 根据数据…

牛客假日团队赛8

牛客假日团队赛8 A Cell Phone Network 思路&#xff1a;最小支配集AC代码#include<stdio.h> #include<iostream> #include<math.h> #include<algorithm> #include<string.h> #include<queue> #include<set> #include<string>…

汽车标志大全 买车必知

简要介绍&#xff1a;为您提供汽车标志、世界汽车标志大全、各种汽车标志、国产汽车标志大全、汽车标志图片、汽车标志及名称、名车标志大全、世界名车排行榜、世界十大名车、世界名车图片等有关汽车标志、汽车图片、汽车名字及汽车品牌方面的知识。 欧美汽车标志图片大全_欧美…

解决: Caused by: java.lang.IllegalStateException: Cannot load driver class: com.mysql.jdbc.Driver

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 报错&#xff1a; Caused by: java.lang.IllegalStateException: Cannot load driver class: com.mysql.jdbc.Driver 2.但是&…

Python与MySQL连接

import MySQLdb #注意大小写&#xff01;&#xff01;#建立和数据库系统的连接conn MySQLdb.connect(hostlocalhost,userroot,passwdsmile,dbtest)#获取操作游标cursor conn.cursor()#执行SQL,创建一个数据库.cursor.execute("""create database python"…

科目三靠边停车技巧要领

正在准备科目三的您&#xff0c;对顺利通过考试有信心吗&#xff1f;今天&#xff0c;小编为大家带来科目三靠边停车技巧&#xff0c;通过讲解靠边停车考试要求&#xff0c;让学员更好地掌握相关技巧&#xff0c;希望能帮到大家。 靠边停车考试项目中规定&#xff0c;车前保险杠…

解决:Field xxMapper in xx.service.impl.xxServiceImpl required a bean of type ‘xx.mapper.xxMapper‘

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 启动 springboot 项目报错&#xff1a; Field userMapper in gentle.service.impl.UserServiceImpl required a bean of type gent…

dojo 九 effects dojo/_base/fx 和 dojo/fx

官方教程&#xff1a;Dojo Effects这里讲学习一下dojo如何实现淡入、淡出、滑动等效果。实现这些特殊的效果有两个包 dojo/_base/fx 和 dojo/fx。dojo/_base/fx 中提供了一些基础的animation方法&#xff0c;如&#xff1a; animateProperty, anim, fadeIn, and fadeOut.dojo/f…

电子路考容易犯错的五大细节

正在学车的你&#xff0c;知道在电子路考中哪些是考生常犯的错误吗&#xff1f;下面&#xff0c;小编为大家带来学车考生参加科目三考试特别容易犯错的地方&#xff0c;尤其是不按规定使用转向灯和在超车时不能根据道路交通情况合理选择行车道或速度这两项犯错的人最多。 ●起步…

Linux 查看 MySQL 版本的四种方法

1 在终端下执行 mysql -V 2 在help中查找 mysql --help |grep Distrib 3 在mysql 里查看 select version() 4 在mysql 里查看 status 转自&#xff1a;https://blog.csdn.net/chengyuc/article/details/77094775

html 基本布局介绍

1、div默认是纵向排列的&#xff0c;例子如下&#xff1a; <div id"wrap"><div id"div1">div1</div><div id"div2">div2</div><div id"div3">div3</div> </div> 2、如果要div横向排列…

考驾照重点科目的关键考试技巧

定点停车停不好关键在于方向盘打得太晚&#xff0c;而且刹车没有控制好&#xff01;刹车和方向应该同步进行&#xff0c;方向盘不要打得太多。上坡停车或者3档以下停车可以先踩离合器&#xff0c;4-5档停车必须先刹车减速以后再踩离合器。 上坡定点停车步骤&#xff1a;听到指令…

第一阶段小结

python简介 定义&#xff1a;是一个免费&#xff0c;开源&#xff0c;跨品台&#xff0c;动态&#xff0c;面向对象的编程语言 程序执行方式&#xff1a; 交互式&#xff1a;在命令行输入指令&#xff0c;回车即可得到结果文件式&#xff1a;将指令编写到py文件中&#xff0c;可…

@JsonSerialize 使用:注解方式 实现条件判断属性值、条件修改属性值

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 数据库中是 1、0 记录性别。 预期效果为&#xff1a;当查到属性值为 1 时&#xff0c;就给序列化后的 json 中性别字段赋值为 “男”…

科目二、科目三易挂项目整理和网友支招

虽然已顺利的拿到小黑本本&#xff0c;成了杀手&#xff0c;但回想起学车的种种经历&#xff0c;不免感慨万千&#xff01;感谢各位网友提供的种种信息&#xff0c;我才能很有信心的顺利通过考试。因此&#xff0c;想把一些失败的经历汇总起来为后来者提个醒&#xff0c;做到心…

我该如何介绍我自己

今天和销售总监一起去见客户&#xff0c;早上8&#xff1a;47分的高铁到苏州。6&#xff1a;30起床&#xff0c;7点赶地铁……上了高铁&#xff0c;和销售总监闲聊几句&#xff0c;看了一点杂志耳边就听到列车广播传出优美的妹子声“苏州园区到了……”。25分钟就到了苏州&…