C++ - 創建動態數組

  • 動態創建數組
//
//  main.cpp
//  創建動態數組
//
//  Created by MENGCHEN on 16/1/19.
//  Copyright ? 2016年 MENGCHEN. All rights reserved.
//

#include <iostream>
class CArray {
    int size;
    int *ptr;
public:
    CArray(int s = 0);
    CArray(CArray & a);
    ~CArray();
    void push_back(int v);
    CArray& operator=(const CArray & a);
    int&operator[](int i);
    int length(){return size;}
};
int& CArray::operator[](int i)//返回值是 int 不行!不支持 a[i] = 4
{   //用以支持根據下標訪問數組元素
    //如n = a[i] 和 a[i] = 4;這樣的語句
    return ptr[i];
}
CArray::CArray(int s):size(s)
{
    if (s==0) {
        ptr =NULL;
    }else{
        ptr = new int[s];
    }
}
//必須重寫復制構造函數,如果使用系統的 那么兩個指針都會指到同一片存儲空間
CArray::CArray(CArray & a){
    if (!a.ptr) {
        ptr = NULL;
        size = 0;
        return;
    }
    ptr = new int[a.size];
    memcpy(ptr, a.ptr, sizeof(int)*a.size);
    size = a.size;
    
}
CArray::~CArray(){
    if (ptr) {
        delete [] ptr;
    }
}
CArray & CArray::operator=(const CArray &a){
    if (ptr == a.ptr) {
        return *this;
    }
    if (a.ptr ==NULL) {
        if (ptr) {
            delete [] ptr;
            ptr = NULL;
            size = 0;
            return *this;
        }
    }
    //當原有空間不夠大的時候,動態分配新的空間
    if (size<a.size) {
        if (ptr) {
            delete [] ptr;
        }
        ptr = new int[a.size];
    }
    memcpy(ptr, a.ptr, sizeof(int)*a.size);
    size = a.size;
    return *this;
}
void CArray::push_back(int v){
    //比較低效的方法,因為每加入一個元素都會分配一次存儲空間,
    //高效的做法:預先分配32(或者一個數量)的運算符,當滿了之后,再按倍數擴大,這樣就不會每次插入的時候都會分配存儲空間。
    if (ptr) {
        int *tmpPtr = new int[size+1];
        memcpy(tmpPtr, ptr, sizeof(int)*(size+1));
        delete [] ptr;
        ptr = tmpPtr;
    }else{
        ptr = new int[1];
    }
    ptr[size++] = v;
}
int main(int argc, const char * argv[]) {
    // insert code here...
    std::cout << "Hello, World!\n";
    return 0;
}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容