C/C++ 規定,數組一旦定義後,它的長度就不能改變了;換句話說,數組容量不能動態地增大或者減小。這樣的數組稱為靜態數組(Static array)。靜態數組有時候會給編碼代碼不便,我們可以通過自訂的 Array 類來實現動態數組(Dynamic array)。所謂動態數組,是指數組容量能夠在使用的過程中隨時增大或減小。
動態數組的完整實現代碼如下:
#include <iostream>#include <cstring>#include <cstdlib>using namespace std;template<typename T, int N>class Array{public: Array(); ~Array();public: T & operator[](int i); //重載下標運算子[] int length() const { return m_length; } //擷取數組長度 bool capacity(int n); //改變數組容量private: int m_length; //數組的當前長度 int m_capacity; //當前記憶體的容量(能容乃的元素的個數) T *m_p; //指向數組記憶體的指標};template<typename T, int N>Array<T, N>::Array(){ m_p = new T[N]; m_capacity = m_length = N;}template<typename T, int N>Array<T, N>::~Array(){ delete[] m_p;}template<typename T, int N>T & Array<T, N>::operator[](int i){ if(i<0 || i>=m_length){ cout<<"Exception: Array index out of bounds!"<<endl; } return m_p[i];}template<typename T, int N>bool Array<T, N>::capacity(int n){ if(n > 0){ //增大數組 int len = m_length + n; //增大後的數組長度 if(len <= m_capacity){ //現有記憶體足以容納增大後的數組 m_length = len; return true; }else{ //現有記憶體不能容納增大後的數組 T *pTemp = new T[m_length + 2 * n * sizeof(T)]; //增加的記憶體足以容納 2*n 個元素 if(pTemp == NULL){ //記憶體配置失敗 cout<<"Exception: Failed to allocate memory!"<<endl; return false; }else{ //記憶體配置成功 memcpy( pTemp, m_p, m_length*sizeof(T) ); delete[] m_p; m_p = pTemp; m_capacity = m_length = len; } } }else{ //收縮數組 int len = m_length - abs(n); //收縮後的數組長度 if(len < 0){ cout<<"Exception: Array length is too small!"<<endl; return false; }else{ m_length = len; return true; } }}int main(){ Array<int, 5> arr; //為數組元素賦值 for(int i=0, len=arr.length(); i<len; i++){ arr[i] = 2*i; } //第一次列印數組 for(int i=0, len=arr.length(); i<len; i++){ cout<<arr[i]<<" "; } cout<<endl; //擴大容量並為增加的元素賦值 arr.capacity(8); for(int i=5, len=arr.length(); i<len; i++){ arr[i] = 2*i; } //第二次列印數組 for(int i=0, len=arr.length(); i<len; i++){ cout<<arr[i]<<" "; } cout<<endl; //收縮容量 arr.capacity(-4); //第三次列印數組 for(int i=0, len=arr.length(); i<len; i++){ cout<<arr[i]<<" "; } cout<<endl; return 0;} 運行結果:
0 2 4 6 8
0 2 4 6 8 10 12 14 16 18 20 22 24
0 2 4 6 8 10 12 14 16
Array 是一個類模板,它有一個型別參數T和一個非型別參數N,T 指明了數組元素的類型,N 指明了數組長度。
capacity() 成員函數是 Array 類的關鍵,它使得數組容量可以動態地增加或者減小。傳遞給它一個正數時,數組容量增大;傳遞給它一個負數時,數組容量減小。
之所以能通過[ ]來訪問數組元素,是因為在 Array 類中以成員函數的形式重載了[ ]運算子,並且傳回值是數組元素的引用。如果直接返回數組元素的值,那麼將無法給數組元素賦值。