您好,登錄后才能下訂單哦!
第一次寫博客,好緊張。。。
暑假在家學習STL,想要自己動手實現一下動態數組(實際上有很大區別,比如動態數組的地址值是固定的、一旦創建容量有上限。然而我自己實現的是地址也跟著隨機分配的“動態數組”。。。),話不多說上源碼:
#include<iostream> using namespace std; class D_array { private: int *a; int n; public: D_array(); D_array(const D_array & array); ~D_array(); int at(int i);//返回動態數組的第i位元素 bool is_full();//判斷數組是否已滿 void add(int in);//給動態數組增加新元素 void expand();//動態數組擴容 int len();//返回數組長度 friend ostream & operator << (ostream & output,const D_array & a);//流插入運算符重載 D_array & operator = (const D_array & darray); int * print_address();//因為數組是動態分配的內存,所以需要接口返回現在的地址值 }; D_array::D_array() { n = 1; a = new int[n]; int i; for (i = 0; i < n; i++) { a[i] = NULL;//初始化數組元素 } } D_array::D_array(const D_array & darray) { int i, n; n = darray.n; this->a = new int[n]; this->n = darray.n; for (i = 0; i < n; i++) { this->a[i] = darray.a[i]; } } D_array::~D_array() { delete[] a;//直接刪除分配的內存空間 } int D_array::at(int i) { if (i >= n) { cout << "wrong input!" << endl; //return 0; } else return a[i]; } bool D_array::is_full() { if (a[n - 1] == NULL) { return false; } else { return true; } } void D_array::add(int input) { int i; if (is_full()) { expand(); for (i = 0; i < n; i++) { if (a[i] == NULL) { break; } else continue; } a[i] = input; } else { for (i = 0; i < n; i++) { if (a[i] == NULL) { break; } else continue; } a[i] = input; } } void D_array::expand() { int *b, i; b = new int[n];//創建輔助數組 for (i = 0; i < n; i++) { b[i] = a[i];//儲存原數組數據 } a = new int[2 * n];//容量每次擴容2倍 for (i = 0; i < 2 * n; i++) { a[i] = NULL;//初始化 } for (i = 0; i < n ; i++)//對自己完成深復制 { a[i] = b[i]; } n = 2 * n;//更改容量 delete[] b;//銷毀輔助數組 } int D_array::len() { int i; for (i = 0; i < n; i++) { if (a[i] == NULL) { break; } else { continue; } } return i; } D_array & D_array::operator=(const D_array & darray) { int i, n; n = darray.n; delete[] this->a; this->a = new int[n]; this->n = darray.n; for (i = 0; i < n; i++) { this->a[i] = darray.a[i]; } return *this; } int * D_array::print_address() { return a;//返回地址值 } ostream & operator<<(ostream & output, const D_array & darray)//不過多贅述 { int i; for (i = 0; i < darray.n; i++) { if (darray.a[i] == NULL) { break; } else { output << darray.a[i] << " "; } } return output; } int main() { int key_in; D_array a, c; while (1) { cin >> key_in; if (key_in == -1) { break; }//一個只能輸入非0元素的動態數組 else { a.add(key_in); } cout << a.print_address() << endl; } D_array b = a; c = a; cout << a << endl; cout << b << endl; cout << c << endl; //cout << a.len() << endl; return 0; }
過程十分簡單,就是初始狀態下數組不儲存值(NULL)。通過add成員函數向動態分配的內存中寫入數據。每次再加入數據時,先用is_full函數檢驗是否滿。如果is_full返回真的話就用expand擴容,一次寫入就結束。然后,順便練習了一下重載<<。
不過寫的時候還踩了一個很是腦殘的坑。一開始我想用復制構造函數初始化b數組,然后就寫出了如下代碼:
D_array a,b; a = b;
實在是智障啊。。。錯誤的原因是:創建b數組時,通過默認構造函數初始化。然后再沒有釋放已分配的內存空間情況下就直接又用復制構造函數再一次初始化了b。所以在調用析構函數時,發生報錯。
順便分享一篇很不錯的文章:http://www.cnblogs.com/raichen/p/4752025.html 詳細介紹了C++復制構造函數,我是看了這篇文章才發現的錯誤。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。