C++ 可变数组实现
话不多说,直接上代码,看注释
#include <iostream>
#include <cstring>
using namespace std;
// 可变数组实现
template<class T>
class Array {
template<class E>
friend ostream& operator<<(ostream &_cout, Array<E> &array); // 重载 << 运算符可直接实现打印
int mSize = 0, mCapacity; // 数组元素个数; 数组容量
T *mPosition; // 数组首地址
int indexCheck(int position){
if (position > mSize || position < -(mSize)) throw out_of_range("数组越界"); // 输入参数越界时,抛出异常
return position < 0 ? position + mSize : position; // 支持负索引,最后一个索引为-1
}
void expandCapacity(){
mCapacity += 5;
T *newPosition = new T[mCapacity]; // 每次申请5个
memcpy(newPosition, mPosition, mSize * sizeof(T)); // 把原数组的数据拷贝进新数组
mPosition = newPosition; // 指针指向更新
}
public:
// 数组初始化,输入参数小于0,默认为5的数组
explicit Array(int capacity = 5) : mCapacity(capacity) {
mPosition = new T[mCapacity]; // 在堆区申请内存
}
// 析构函数
~Array() {
delete[] mPosition; // 释放堆区空间
mPosition = nullptr;
}
// 向数组内添加元素
void add(T value) {
// 当前元素等于容量
if (mSize == mCapacity) expandCapacity(); // 扩大容量
*(mPosition + mSize) = value; // 向数组中添加元素
mSize++;
}
// 获取数组内指定索引的元素
T get(int position) {
return *(mPosition + indexCheck(position));
}
// 重载[]运算符,可以使用索引获取
T operator[](int position) {
return get(position);
}
// 获取当前元素个数
int size() const {
return mSize;
}
// 删除数组类指定位置的元素
bool remove(int position){
position = indexCheck(position);
for (int i = position+1; i < mSize; ++i) {
*(mPosition+i-1) = *(mPosition+i); // 所有元素前移
}
mSize--;
return true; // 删除成功
}
bool insert(int position, int value){
position = indexCheck(position); // 索引合法性检查
if (mSize == mCapacity) expandCapacity(); // 如果当前数组已满,扩大容量
for (int i = mSize; i >= position; --i) {
*(mPosition+i+1) = *(mPosition+i);
}
*(mPosition+position) = value;
mSize ++;
return true;
}
};
// 重载 << 运算符可直接实现打印
template <class T>
ostream &operator<<(ostream &_cout, Array<T> &array){
cout << "[";
for (int i = 0; i < array.mSize; ++i) {
cout << array[i];
if (i != array.mSize-1) cout << ", ";
}
cout << "]";
return _cout;
}


