leetcode array :實現動態陣列
阿新 • • 發佈:2021-02-10
技術標籤:leetcode
文章目錄
O
掌握動態陣列的基本操作
問題
實現一個支援動態擴容的陣列類。
實現
思路
該題考察陣列基礎, 記憶體管理, 邊界問題, 運算子過載,類的基本操作。過程參照了here
- 首先我們考慮最原始的設計: 構造和析構。 他們的設計過程中還要實現引用構造 基礎建構函式需要注意我們不支援使用列表進行初始化, 最原始的建構函式只是負責建立大小n的空間,返回地址。再增加一個size返回成員函式。
- 成員變數中我們必須要設計到陣列指標, 還有大小。 注意大小並不希望外界直接訪問, 建議安排一個函式去讀取。
- 運算子過載時我們需要考慮= 和[]過載。 需要注意【】返回的是整數, 而= 返回的是類本身引用。
- 我們要增加一個末尾插入的操作, 末尾插入時候需要注意如果記憶體不夠要進行擴充,這裡面我們擴1.5倍。
易錯點
- 類中的size指的是含有實際資料的空間大小。 並不是分配的空間大小。 因此末尾插入時候size大小一定要逐步增加, 指標不用增加,直接指向增加好得另外一個temp指標中。,每次增加的時候只增加size大小。
- 過載時候下標過載和 = 過載需要注意。 =過載時候根據size大小決定是否重新分配。
- 類成員函式的外部實現方式之前不知道。
- 時刻注意邊界值問題,還有刪除不用的記憶體。
- 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;
}