日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

怎样在数组末尾添加数据_如何利用C++实现可变长的数组?

發布時間:2023/12/13 c/c++ 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 怎样在数组末尾添加数据_如何利用C++实现可变长的数组? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

應該執行什么功能?

假設我們要實現一個將自動擴展的數組類,是否需要實現函數?讓我們從下面主要功能使用的功能開始,看看我們需要實現哪些功能。


輸出結果:

0 1 2 3 4

0 1 2 100 4

您需要做什么才能實現上述功能?首先列出:

  • 若要使用動態分配的內存來存儲數組元素,并且需要一個指針成員變量

  • 重載分配=運算符

  • 重載括號[]運算符

  • 重載的副本構造函數

  • 實現push_back和length函數


- 2 -

實現步驟

要實現可變長度數組類,您基本上需要實現以下7個功能:

01構造函數

構造函數的目的是初始化一個數組,代碼如下:

// 構造函數MyArray::MyArray(int s = 0):m_size(s){ // 當初始化長度為0的數組時,數組指針就是空的 if(s == 0) m_ptr = NULL; // 當初始化長度不為0時,則申請對應大小的空間 else m_ptr = new int[s];

02復制構造函數

復制構造函數的目的是產生一個與輸入對象相同的對象,但是由于MyArray類具有指針成員變量,因此必須使用深層復制來實現復制構造函數。如果使用默認的復制構造函數,則使兩個對象的指針成員變量指向同一地址將非常危險。

// 復制構造函數MyArray::MyArray(const MyArray &a){ // 如果入參的數組對象的指針地址為空時, // 則也初始化一個空的數組 if(a.m_ptr == NULL) { m_ptr = NULL; m_size = 0; } // 如果入參的數組對象有數據時,則申請一個新的地址, // 最后來復制入參對象數組對象的數據和大小。 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析構函數

析構函數的目的是釋放數組的資源,代碼如下:

// 析構函數MyArray::~MyArray(){ // 如果指針地址不為空時,則釋放資源 if(m_ptr) delete [] m_ptr;}

04 重載分配=運算符函數

重載分配=運算符函數目的就是 = 號左邊對象里存放的數組,大小和內容都和右邊的對象一樣,代碼如下:

// 重載賦值 = 運算符函數MyArray & MyArray::operator=(const MyArray & a){ if(m_ptr == a.m_ptr) // 防止a=a這樣的賦值導致出錯 return *this; if(a.m_ptr == NULL) // 如果a里面的數組是空的 { if(m_ptr) delete [] m_ptr; // 釋放舊數組的資源 m_ptr = NULL; m_size = 0; return *this; } // 如果原有空間足夠大,就不用分配新的空間 if(m_size < a.m_size)用分配新的空間 { if(m_ptr) delete [] m_ptr; // 釋放舊數組的資源 m_ptr = new int[a.m_size]; // 申請新的內存地址 } // 拷貝內容 memcpy(m_ptr, a.m_ptr, sizeof(int)*a.m_size); m_size = a.m_size; return *this;}

05重載[]操作符功能

重載[]運算符功能的目的是通過[]運算符獲取相應下標的數組值,代碼如下:

// 重載[]運算符函數int & MyArray::operator[](int i){ return m_ptr[i]; // 返回對應下標的數組值}

06將元素添加到數組末尾的函數

push_back函數的目的是在數組的末尾添加一個新元素,代碼如下:

// 在數組尾部添加一個元素void MyArray::push_back(int v){ if(m_ptr) // 如果數組不為空 { // 重新分配空間 int *tmpPtr = new int[m_size + 1]; // 拷貝原數組內容 memcpy(tmpPtr, m_ptr, sizeof(int)*m_size); delect [] m_ptr; m_ptr = tmpPtr; } else // 如果數組本來就是空的 { m_ptr = new int[1]; } m_ptr[m_size++] = v; //加入新的數組元素}

07獲取數組長度的函數

長度函數相對簡單。它直接返回成員變量m_size,即數組的長度。代碼如下:

// 獲取數組長度的函數int MyArray:;length(){ return m_size;}

— 04 —— 04 —

改進它?

push_back函數仍有優化的空間。每次添加元素時,當前的push_back函數都會重新分配新的內存,這會增加開銷。

然后是優化思想:預先分配大小為n的空間,當數組大小不足時,然后繼續重新分配2n大小的空間,依此類推。

我們需要添加兩個成員變量:

int m_cout; // 數組元素的個數 int m_newNum; // 擴容的次數

改進的push_back函數,代碼如下:


— 5 —— 5 —

概要

最后,總體代碼如下:

總結

以上是生活随笔為你收集整理的怎样在数组末尾添加数据_如何利用C++实现可变长的数组?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。