主函数 main.cpp
#include <iostream>
#include "QFMutableArray.hpp"
using namespace std;
int main(int argc, char const *argv[])
{
QFMutableArray<int> *multableArray = new QFMutableArray<int>();
// 初始化数组
for (int i = 0; i < 10; i++)
{
multableArray->add(i);
}
cout << multableArray->str() << endl;
/*
// 在位置2添加元素99
multableArray->add(2, 99);
cout << multableArray->str() << endl;
// 删除位置2元素
multableArray->remove(2);
cout << multableArray->str() << endl;
// 元素下标位置
cout << "元素 2 的下标位置为 " << multableArray->index(2) << endl;
cout << "元素 100 的下标位置为 " << multableArray->index(100) << endl;
// 删除元素 0
cout << multableArray->removeElement(1) << endl;
cout << multableArray->str() << endl;
cout << multableArray->removeElement(10) << endl;
// 清空元素
multableArray->clear();
cout << multableArray->str() << endl;
*/
// 替换指定下标元素 并返回指定的元素
cout << "被替换的元素是 : " << multableArray->set(2, 88) << endl;
cout << multableArray->str() << endl;
cout << "被替换的元素是 : " << multableArray->set(2, 99) << endl;
cout << multableArray->str() << endl;
cout << "下标 2 的元素是 : " << multableArray->get(2) << endl;
cout << multableArray->str() << endl;
cout << "元素个数是 : " << multableArray->length() << endl;
// 排序元素 从小到大
multableArray->sort();
cout << multableArray->str() << endl;
// 程序成功运行
return EXIT_SUCCESS;
}
QFMutableArray.hpp 文件
#include "QFMutableContainer.h"
#include <string>
#include <sstream>
template <typename E>
class QFMutableArray : public QFMutableContainer<E>
{
private:
E *array; // 真正用来存储元素的数组
int len; // 元素数量
public:
QFMutableArray(); // 无参构造
~QFMutableArray();
/*
使用了override关键字但是基类中并没有对应的虚函数,能够检测出问题
*/
// 在模板添加元素
void add(E ele) override;
// 在指定下标位插入一个元素
void add(int index, E ele) override;
// 按照下标删除元素
E remove(int index) override;
// 按照元素进行删除
bool removeElement(E ele) override;
// 清空容器
void clear() override;
// 通过下标修改元素 返回被覆盖的数
E set(int index, E exe) override;
// 通过下标获取元素
E get(int index) override;
// 排序
void sort() override;
// 查找元素出现的下标
int index(E ele) override;
// 将容器中的元素拼接成字符串
string str() override;
// 返回容器中元素数量
int length() override;
};
template <typename E>
inline QFMutableArray<E>::QFMutableArray()
{
array = new E[0];
len = 0;
}
template <typename E>
inline void QFMutableArray<E>::add(E ele)
{
/* 创建一个新数组,新数组长度是原数组长度+1
将院楼数组的元素依次拷贝到新数组中,并且将新数据写入
修改 Array 数组指向,指向新数组
*/
// 1 创建新数组
E *tmp = new E[len + 1];
for (int i = 0; i < len; i++)
{
tmp[i] = array[i];
}
// 2添加元素放到最后
tmp[len] = ele;
len++;
// 3.修改指针指向
delete array;
array = tmp;
}
// 在指定下标位插入一个元素
template <typename E>
inline void QFMutableArray<E>::add(int index, E ele)
{
// 1 创建新数组
E *tmp = new E[len + 1];
for (int i = 0; i < index; i++)
{
tmp[i] = array[i];
}
// 2添加元素放到指定位置
tmp[index] = ele;
for (int i = index; i <= len; i++)
{
tmp[i + 1] = array[i];
}
len++;
// 3.修改指针指向
delete array;
array = tmp;
}
// 考虑溢出情况,重新写
template <typename E>
inline E QFMutableArray<E>::remove(int index)
{
E ele = array[index];
E *tmp = new E[len - 1];
for (int i = 0; i < index; i++)
{
tmp[i] = array[i];
}
for (int i = index; i < len; i++)
{
tmp[i] = array[i + 1];
}
len--;
// 3.修改指针指向
delete array;
array = tmp;
return ele;
}
template <typename E>
inline bool QFMutableArray<E>::removeElement(E ele)
{
int find = index(ele);
if (find == -1)
return false;
remove(find);
return true;
}
template <typename E>
inline void QFMutableArray<E>::clear()
{
// 将原来的数组置位空
delete array;
array = new E(0);
// 重置元素数量
len = 0;
}
template <typename E>
inline E QFMutableArray<E>::set(int index, E exe)
{
if (index < 0 || index >= len)
{
return false;
}
E cover = array[index];
array[index] = exe;
return cover;
}
template <typename E>
inline E QFMutableArray<E>::get(int index)
{
if (index < 0 || index >= len)
{
return false;
}
E cover = array[index];
return cover;
}
template <typename E>
inline void QFMutableArray<E>::sort()
{
for (int i = 0; i < len - 1; i++)
{
int minIndex = i;
for (int j = i + 1; j < len; j++)
{
if (array[minIndex] > array[j])
{
minIndex = j;
}
}
if (minIndex != i)
{
E tmp = array[i];
array[i] = array[minIndex];
array[minIndex] = tmp;
}
}
}
template <typename E>
inline int QFMutableArray<E>::index(E ele)
{
for (int i = 0; i < len; i++)
{
if (array[i] == ele)
{
return i;
}
}
return -1;
}
// 将容器中的元素拼接成字符串
template <typename E>
inline string QFMutableArray<E>::str()
{
if (len == 0)
{
return "[]";
}
// 创建一个 ostringstream 对象 来拼接元素
ostringstream oss;
oss << "[";
for (int i = 0; i < len - 1; i++)
{
oss << array[i] << ",";
}
oss << array[len - 1] << "]";
return oss.str();
}
template <typename E>
inline QFMutableArray<E>::~QFMutableArray()
{
// 检查指针 array 是否为 nullptr,如果不是,则释放
if (array != nullptr)
{
delete[] array;
array = nullptr;
}
}
template <typename E>
inline int QFMutableArray<E>::length()
{
return len;
}
QFMutableContainer.h 文件
#ifndef QFMUTABLECONTAINER_H
#define QFMUTABLECONTAINER_H
#include <iostream>
#include <sstream>
using namespace std;
// 定义模板类
template <typename E>
class QFMutableContainer
{
public:
~QFMutableContainer() { cout << "QFMutableContainer 析构函数" << endl; }
// 在模范添加元素
virtual void
add(E ele) = 0;
// 在指定下标位插入一个元素
virtual void add(int index, E ele) = 0;
// 安装下标删除元素
virtual E remove(int index) = 0;
// 按照元素进行删除
virtual bool removeElement(E ele) = 0;
// 清空容器
virtual void clear() = 0;
// 通过下标修改元素
virtual E set(int index, E exe) = 0;
// 通过下标获取元素
virtual E get(int index) = 0;
// 排序
virtual void sort() = 0;
// 查找元素出现的下标
virtual int index(E ele) = 0;
// 将容器中的元素拼接成字符串
virtual string str() = 0;
// 返回容器中元素数量
virtual int length() = 0;
};
#endif