C 手把手教你實現可變長的陣列

2022-01-09 21:46:00 字數 2614 閱讀 3208

假設我們要實現乙個會自動擴充套件的陣列,要實現什麼函式呢?先從下面的main函式給出的實現,看看有什麼函式是需要我們實現的。

int main()

輸出結果:

0 1 2 3 4

0 1 2 100 4

要實現的方式,要做哪些事情呢?我先列一下:

要實現乙個可變長陣列類的,基本需要實現下面的7個函式:

class myarray // 可變長陣列類

;

1. 建構函式

建構函式的目的就是初始化乙個陣列,**如下:

// 建構函式

myarray::myarray(int s = 0):m_size(s)

2. 複製建構函式

複製建構函式目的就是產生乙個與入參物件一樣的物件,但是由於myarray類是有指標成員變數的,所以我們必須才用深拷貝的方式來實現複製建構函式,如果使用預設的複製建構函式,則會導致兩個物件的指標成員變數指向的位址是同乙個,這是非常危險的。

// 複製建構函式

myarray::myarray(const myarray &a)

// 如果入參的陣列物件有資料時,則申請乙個新的位址,最後來複製入參物件陣列物件的資料和大小。

else

}

3. 析構函式

析構函式的目的就是釋放陣列的資源

// 析構函式

myarray::~myarray()

4. 過載賦值=運算子函式

過載賦值=運算子函式目的就使=號左邊物件裡存放的陣列,大小和內容都和右邊的物件一樣

// 過載賦值=運算子函式

myarray & myarray::operator=(const myarray & a)

if(m_size < a.m_size) // 如果原有空間足夠大,就不用分配新的空間

memcpy(m_ptr, a.m_ptr, sizeof(int)*a.m_size);

m_size = a.m_size;

return *this;

}

5. 過載運算子函式

過載運算子函式目的就是能通過運算子來獲取對應下標的陣列值

// 過載運算子函式

int & myarray::operator(int i)

6. 加入元素到陣列末尾的函式

push_back函式的目的就是把乙個新的元素,加入到陣列的末尾

// 在陣列尾部新增乙個元素

void myarray::push_back(int v)

else // 如果陣列本來就是空的

m_ptr[m_size++] = v; //加入新的陣列元素

}

7. 獲取陣列長度的函式

length()函式就比較簡單了,直接返回成員變數m_size,就是陣列的長度了

// 獲取陣列長度的函式

int myarray:;length()

可變長陣列型別實現的整體**,如下:

class myarray

// 2. 複製建構函式

myarray(const myarray &a)

else

}// 3. 拷貝建構函式

~myarray()

// 4. 過載賦值=運算子函式

myarray & operator=(const myarray & a)

if(m_size < a.m_size)

memcpy(m_ptr, a.m_ptr, sizeof(int)*a.m_size); // 拷貝原陣列內容

m_size = a.m_size;

return *this;

}// 5. 過載運算子函式

int & operator(int i)

// 6. 在陣列的末尾加入乙個新的元素

void push_back(int v)

else // 如果陣列本來就是空的

m_ptr[m_size++] = v; //加入新的陣列元素

}// 7. 獲取陣列的長度

int length()

private:

int m_size; // 陣列元素的個數

int* m_ptr; // 指向動態分配的陣列

};

還有就是 push_back 函式還有優化的空間,當前的 push_back 函式每加入乙個元素都會重新分配新的記憶體,這是會增大開銷的,那麼優化的思路:

提前分配好乙個 n 大小的空間,當陣列大小不夠的時候,則才繼續重新分配 2n 大小的空間,以此類推。

實現sigmoid 手把手教你自己動手實現神經網路

階躍函式是指一旦輸入超過閾值,就切換輸出的函式。上述感知機中使用的就是該種啟用函式,一旦a大於0則,輸出變為1.上述感知機的階躍函式圖形如下,從圖中可以看出該階躍函式以0為界,輸出從0切換為1 或從1切換為0 值呈階梯式變化,因此稱為階躍函式。sigmoid函式與階躍函式對比 sigmoid函式 右...

手把手教你實現物理碰撞的網路同步

現如今,網路同步的技術在各種遊戲裡被廣泛應用和發展,那麼,如何在unity中搭建網路模組?如何使伺服器和客戶端之間通訊?如何做到網路同步?本文作者爛筆頭 27將從自身經驗出發,為大家一一解答這些疑問。系列回顧 手把手教你實現unity網路同步 八 物理碰撞的網路同步 新建乙個預設ball,樣子是這樣...

手把手教你實現鍊錶的歸併排序

參考資料 資料結構與演算法分析 第三版英文版 書本題目 7.20 269頁 這個題目的意思很簡單,就是實現鍊錶的歸併排序 先實現乙個簡單的節點node結構 struct node node 再到鍊錶 struct list 在main函式裡面測試鍊錶是否成功 int main system paus...