1. 程式人生 > 其它 >leetcode array :實現動態陣列

leetcode array :實現動態陣列

技術標籤:leetcode

文章目錄

O

掌握動態陣列的基本操作

問題

實現一個支援動態擴容的陣列類。

實現

思路

該題考察陣列基礎, 記憶體管理, 邊界問題, 運算子過載,類的基本操作。過程參照了here

  1. 首先我們考慮最原始的設計: 構造和析構。 他們的設計過程中還要實現引用構造 基礎建構函式需要注意我們不支援使用列表進行初始化, 最原始的建構函式只是負責建立大小n的空間,返回地址。再增加一個size返回成員函式。
  2. 成員變數中我們必須要設計到陣列指標, 還有大小。 注意大小並不希望外界直接訪問, 建議安排一個函式去讀取。
  3. 運算子過載時我們需要考慮= 和[]過載。 需要注意【】返回的是整數, 而= 返回的是類本身引用。
  4. 我們要增加一個末尾插入的操作, 末尾插入時候需要注意如果記憶體不夠要進行擴充,這裡面我們擴1.5倍。

易錯點

  1. 類中的size指的是含有實際資料的空間大小。 並不是分配的空間大小。 因此末尾插入時候size大小一定要逐步增加, 指標不用增加,直接指向增加好得另外一個temp指標中。,每次增加的時候只增加size大小。
  2. 過載時候下標過載和 = 過載需要注意。 =過載時候根據size大小決定是否重新分配。
  3. 類成員函式的外部實現方式之前不知道。
  4. 時刻注意邊界值問題,還有刪除不用的記憶體。
  5. this指標如何使用? 目前還沒搞懂。

程式碼實現






#include<iostream>
//#include<cstring>
using namespace std; class vector{ public: vector(int size = 0); vector(const vector &a); ~vector(); int length(){return size;} vector& operator =(const vector & a); int& operator[](int i){ return ptr[i];} void push_back(int i); private
: int size; int *ptr; }; vector::vector(int size):size(size){ if(size==0){ ptr == NULL; } else{ ptr = new int[size]; } } vector::vector(const vector &a){ if(!a.ptr){ ptr = NULL; size = 0; return ; } else{ ptr = new int[a.size]; memcpy(ptr, a.ptr, sizeof(int)*a.size); size = a.size; } } void vector::push_back(int i){ if(!ptr){ ptr = new int[1]; ptr[0] = i; size++; } else{ int *ptrTwo = new int[size+1]; memcpy(ptrTwo, ptr, sizeof(int)*size); delete[] ptr; ptr = ptrTwo; *(ptr) = i; // this is point size++; } } vector& vector::operator=(const vector &a){ if(!a.ptr){ ptr = NULL; size = 0; return *this; } if (size<a.size){ delete[] ptr; ptr = new int[a.size]; } memcpy(ptr,a.ptr,sizeof(int)*a.size); size = a.size; } vector::~vector(){ if(ptr){ delete[] ptr; } } int main(){ vector a(2); cout<<"ok"<<a.length()<<endl; a.push_back(2); cout<<a.length()<<endl; a.push_back(2); cout<<a.length()<<endl; a.push_back(2); a.push_back(2); cout<<a.length()<<endl; }

執行結果

在這裡插入圖片描述