話不多說,直接上代碼,看注釋
#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; }
如有問題,感謝批評指正
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/308182.html
標籤:C++
上一篇:SSA
