假設我們要實現乙個會自動擴充套件的陣列,要實現什麼函式呢?先從下面的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...