C++中定義動態數組__C++

來源:互聯網
上載者:User

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 類中以成員函數的形式重載了[ ]運算子,並且傳回值是數組元素的引用。如果直接返回數組元素的值,那麼將無法給數組元素賦值。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.