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; }