怎样在数组末尾添加数据_如何利用C++实现可变长的数组?
應該執(zhí)行什么功能?
假設我們要實現(xiàn)一個將自動擴展的數(shù)組類,是否需要實現(xiàn)函數(shù)?讓我們從下面主要功能使用的功能開始,看看我們需要實現(xiàn)哪些功能。
輸出結(jié)果:
0 1 2 3 4
0 1 2 100 4
您需要做什么才能實現(xiàn)上述功能?首先列出:
若要使用動態(tài)分配的內(nèi)存來存儲數(shù)組元素,并且需要一個指針成員變量
重載分配=運算符
重載括號[]運算符
重載的副本構(gòu)造函數(shù)
實現(xiàn)push_back和length函數(shù)
- 2 -
實現(xiàn)步驟
要實現(xiàn)可變長度數(shù)組類,您基本上需要實現(xiàn)以下7個功能:
01構(gòu)造函數(shù)
構(gòu)造函數(shù)的目的是初始化一個數(shù)組,代碼如下:
// 構(gòu)造函數(shù)MyArray::MyArray(int s = 0):m_size(s){ // 當初始化長度為0的數(shù)組時,數(shù)組指針就是空的 if(s == 0) m_ptr = NULL; // 當初始化長度不為0時,則申請對應大小的空間 else m_ptr = new int[s];02復制構(gòu)造函數(shù)
復制構(gòu)造函數(shù)的目的是產(chǎn)生一個與輸入對象相同的對象,但是由于MyArray類具有指針成員變量,因此必須使用深層復制來實現(xiàn)復制構(gòu)造函數(shù)。如果使用默認的復制構(gòu)造函數(shù),則使兩個對象的指針成員變量指向同一地址將非常危險。
// 復制構(gòu)造函數(shù)MyArray::MyArray(const MyArray &a){ // 如果入?yún)⒌臄?shù)組對象的指針地址為空時, // 則也初始化一個空的數(shù)組 if(a.m_ptr == NULL) { m_ptr = NULL; m_size = 0; } // 如果入?yún)⒌臄?shù)組對象有數(shù)據(jù)時,則申請一個新的地址, // 最后來復制入?yún)ο髷?shù)組對象的數(shù)據(jù)和大小。 else { m_ptr = new int[a.m_size]; memcpy(m_ptr, a.m_ptr, sizeof(int)*a.m_size); m_size = a.m_size; }}03析構(gòu)函數(shù)
析構(gòu)函數(shù)的目的是釋放數(shù)組的資源,代碼如下:
// 析構(gòu)函數(shù)MyArray::~MyArray(){ // 如果指針地址不為空時,則釋放資源 if(m_ptr) delete [] m_ptr;}04 重載分配=運算符函數(shù)
重載分配=運算符函數(shù)目的就是 = 號左邊對象里存放的數(shù)組,大小和內(nèi)容都和右邊的對象一樣,代碼如下:
// 重載賦值 = 運算符函數(shù)MyArray & MyArray::operator=(const MyArray & a){ if(m_ptr == a.m_ptr) // 防止a=a這樣的賦值導致出錯 return *this; if(a.m_ptr == NULL) // 如果a里面的數(shù)組是空的 { if(m_ptr) delete [] m_ptr; // 釋放舊數(shù)組的資源 m_ptr = NULL; m_size = 0; return *this; } // 如果原有空間足夠大,就不用分配新的空間 if(m_size < a.m_size)用分配新的空間 { if(m_ptr) delete [] m_ptr; // 釋放舊數(shù)組的資源 m_ptr = new int[a.m_size]; // 申請新的內(nèi)存地址 } // 拷貝內(nèi)容 memcpy(m_ptr, a.m_ptr, sizeof(int)*a.m_size); m_size = a.m_size; return *this;}05重載[]操作符功能
重載[]運算符功能的目的是通過[]運算符獲取相應下標的數(shù)組值,代碼如下:
// 重載[]運算符函數(shù)int & MyArray::operator[](int i){ return m_ptr[i]; // 返回對應下標的數(shù)組值}06將元素添加到數(shù)組末尾的函數(shù)
push_back函數(shù)的目的是在數(shù)組的末尾添加一個新元素,代碼如下:
// 在數(shù)組尾部添加一個元素void MyArray::push_back(int v){ if(m_ptr) // 如果數(shù)組不為空 { // 重新分配空間 int *tmpPtr = new int[m_size + 1]; // 拷貝原數(shù)組內(nèi)容 memcpy(tmpPtr, m_ptr, sizeof(int)*m_size); delect [] m_ptr; m_ptr = tmpPtr; } else // 如果數(shù)組本來就是空的 { m_ptr = new int[1]; } m_ptr[m_size++] = v; //加入新的數(shù)組元素}07獲取數(shù)組長度的函數(shù)
長度函數(shù)相對簡單。它直接返回成員變量m_size,即數(shù)組的長度。代碼如下:
// 獲取數(shù)組長度的函數(shù)int MyArray:;length(){ return m_size;}— 04 —— 04 —
改進它?
push_back函數(shù)仍有優(yōu)化的空間。每次添加元素時,當前的push_back函數(shù)都會重新分配新的內(nèi)存,這會增加開銷。
然后是優(yōu)化思想:預先分配大小為n的空間,當數(shù)組大小不足時,然后繼續(xù)重新分配2n大小的空間,依此類推。
我們需要添加兩個成員變量:
int m_cout; // 數(shù)組元素的個數(shù) int m_newNum; // 擴容的次數(shù)改進的push_back函數(shù),代碼如下:
— 5 —— 5 —
概要
最后,總體代碼如下:
總結(jié)
以上是生活随笔為你收集整理的怎样在数组末尾添加数据_如何利用C++实现可变长的数组?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Avro Schema Evolutio
- 下一篇: 腾讯校招历年经典面试汇总:C++研发岗