怎樣在數組末尾添加數據_如何利用C++實現可變長的數組?

應該執行什么功能?

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

7c1343979bf644055e6fc14abd98f9e0.png


輸出結果:

0 1 2 3 4

0 1 2 100 4

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

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

  • 重載分配=運算符

  • 重載括號[]運算符

  • 重載的副本構造函數

  • 實現push_back和length函數


- 2 -

實現步驟

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

f9b54b775dcb3bfabd23a330fb448cb2.png

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函數,代碼如下:

c4e459caacd6e4402c6bdb7bdae94b60.png


— 5 —— 5 —

概要

最后,總體代碼如下:

7c3f6df5213e37cb02554246b047870a.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443634.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443634.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443634.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux學習:第六章-Linux服務和進程管理

一進程查看 1psaux查看當前系統所有運行的進程 -a顯示前臺所有進程 -u顯示用戶名 -x顯示后臺進程 user&#xff1a; 用戶名 pid&#xff1a;進程id。PID1init系統啟動的第一個進程 %CPUcpu占用百分比 %MEM內存占用百分比 VSZ虛擬內存占用量KB RSS固定內存占有量 tty登錄終端tty…

覆蓋索引與聯合索引_淺析MySQL的索引覆蓋和索引下推

寫在前面在MySQL數據庫中&#xff0c;索引對查詢的速度有著至關重要的影響&#xff0c;理解索引也是進行數據庫性能調優的起點&#xff0c;索引就是為了提高數據查詢的效率。今天我們來聊聊在MySQL索引優化中兩種常見的方式&#xff0c;索引覆蓋和索引下推索引覆蓋要了解索引覆…

python3 輸入輸出_Python3基礎之輸入和輸出實例分析

通常來說&#xff0c;一個Python程序可以從鍵盤讀取輸入&#xff0c;也可以從文件讀取輸入&#xff1b;而程序的結果可以輸出到屏幕上&#xff0c;也可以保存到文件中便于以后使用。本文就來介紹Python中最基本的I/O函數。一、控制臺I/O1.讀取鍵盤輸入內置函數input([prompt])&…

redis 哨兵 異步_突破Java面試(23-8) - Redis哨兵主備切換的數據丟失問題-阿里云開發者社區...

1 數據丟失的兩個場景主備切換的過程&#xff0c;可能會導致數據丟失1.1 異步復制由于 master > slave的復制是異步的&#xff0c;所以可能有部分數據還沒復制到slave&#xff0c;master就宕機&#xff0c;于是這些數據就丟失了1.2 腦裂導致腦裂&#xff0c;也就是說&#x…

vue 斷開正在發送的請求_vue 發送請求頻繁時取消上一次請求

前言&#xff1a;在項目中經常有一些場景會連續發送多個請求&#xff0c;而異步會導致最后得到展示的結果可能不是最后一次發送請求返回的結果&#xff0c;且對性能也有非常大的影響。場景&#xff1a;列表式切換商品&#xff0c;有時候上一次請求的結果非常慢&#xff0c;而我…

Linux學習:第六章-Linux網絡配置

上一章的補充&#xff1a; 常見網絡端口&#xff1a; 2021ftp服務文件共享 22ssh服務安全遠程網絡管理 23telnet服務 25smtp&#xff1a;簡單郵件傳輸協議發信 110pop3&#xff1a;郵局協議收信 80www網頁服務 3306mysql端口 3389windows終端服務 53DNS端口 /etc/services所有系…

sequelize 增加數據庫字段_Node項目使用Sequelize操作數據庫(一)(包括模型,增,刪、改等)...

Sequelize 是一個基于 Promise 的 Node.js ORM&#xff0c;目前支持 Postgres、MySQL、SQLite 和 Microsoft SQL Server。它具有強大的事務支持&#xff0c;關聯關系、讀取和復制等功能。所謂ORM是指對象關系映射&#xff0c;通過使用描述對象和數據庫之間映射的元數據&#xf…

django orm插入一條_如何通過django的ORM遠程發布文章?

利用django的ORM可以方便的給數據庫插入文章但是假如我django放在阿里云&#xff0c;那我想在本地寫個插件&#xff0c;每天很方便的插入一些數據&#xff0c;最好是通過ORM的&#xff0c;因為管理起來比較方便&#xff0c;會涉及到多個站&#xff0c;可能會有200多個站&#x…

循環斐波那契數列_第五課:斐波那契數列(第一課時)

簡介&#xff1a;又稱黃金分割數列、因數學家列昂納多斐波那契以兔子繁殖為例子而引入&#xff0c;故又稱為“兔子數列”&#xff0c;指的是這樣一個數列&#xff1a;1、1、2、3、5、8、13、21、34……在數學上&#xff0c;斐波那契數列以如下被以遞推的方法定義&#xff1a;F(…

命令行 藍牙_Ubuntu使用BlueZ驅動藍牙dongle

藍牙dongle即藍牙適配器&#xff0c;一般為USB接口&#xff0c;通過USB連接到PC等設備。連接dongle后&#xff0c;PC即可使用驅動程序控制dongle連接其它藍牙設備。本文主要介紹在Ubuntu系統中安裝BlueZ的方法及藍牙的使用。01獲取BlueZBlueZ是Linux系統的官方藍牙協議棧&#…

Java在Windows下導出xml文件到Linux服務器上

最近由于公司項目需要&#xff0c;學習了在Windows平臺導出xml文件到Linux服務器上的指定目錄下的方法&#xff0c;&#xff08;注&#xff1a;這里的我的Linux是在本機上裝的虛擬機&#xff09;現在寫下來記錄一下&#xff01; 1.首先是項目截圖&#xff1a; 2.主要是類&…

java peek函數_Java 8 Stream Api 中的 peek 操作

1. 前言我在 Java 8 Stream API中的 map 和flatMap 中講述了Java8 Stream API中 map 操作和 flatMap 操作的區別。然后有小伙伴告訴我 peek 操作 也能實現元素的處理。但是你知道 map 和 peek 的區別嗎&#xff1f; map 我們在開頭文章已經講過了&#xff0c;你可以去詳細了解一…

iphone如何查看dns延遲_iPhone手機網速慢?1分鐘教你設置DNS,網速立馬翻一番

很多小伙伴在購機時選擇蘋果手機都是因為iOS系統的流暢度和精簡性&#xff0c;但iPhone在可玩性和信號方面是不如安卓手機的。大家在使用過程中一定遇到過這樣的情況&#xff0c;連接同一個無線網&#xff0c;但是蘋果的網速總是要比安卓慢&#xff0c;這該怎么辦呢&#xff1f…

mysql 關系_MySQL之關系

關系多對多的關系&#xff0c;如何通過mysql來表示站在老師的角度一個老師可以教多個學生&#xff0c;一個老師也可以教一個學生。站在學生的角度一個學生可以被一個老師教一個學生也可以被多個老師教結論&#xff1a;如果站在兩邊看都是一對多的情況&#xff0c;那么這個關系就…

mysql賬號密碼忘_mysql用戶名密碼忘記了解決方法

今天想用一下實驗室服務器的mysql&#xff0c;發現不記得用戶名密碼了。解決方法如下&#xff1a;1. 保證服務器處于安全的狀態&#xff0c;如果可以請拔掉網線...(不過我跳過了這一步&#xff0c;額)2. 修改/etc/my.cnf文件在[mysqld]的段中加入&#xff1a;skip-grant-tables…

copying mysql status_mysql慢查詢copying to tmp table

windows server&#xff0c;無論修改my.ini的tmp_table_size&#xff0c;max_heap_table_size到多少&#xff0c;情況都一樣。同樣的表和查詢語句&#xff0c;在本地運行&#xff0c;沒出現慢查詢。SELECTg.goods_id,g.goods_name,g.shop_price,g.goods_thumb,SUM(og.goods_num…

JDK 7,jdk1.7 安裝及配置

1.打開網頁&#xff1a;http://www.oracle.com 下載對應平臺的合適JDK。 2. 雙擊下載的exe,如jdk-7u7-windows-i586.exe。 3.進入安裝向導&#xff1a; 4.下一步&#xff0c;更改安裝路徑&#xff0c;選擇安裝所有組件。 更改為D:\jdk1.7.0_07\ 點擊確定 5.下一步&#xff0c;…

c mysql 編譯_MySQL編譯安裝之cmake

mysql版本5.5以上編譯安裝時需要用到軟件cmake&#xff0c;cmake特性是獨立于源碼編譯&#xff0c;編譯工作可以在另外一個目錄中而非源碼目錄中進行&#xff0c;mysql版本5.5以上編譯安裝時需要用到軟件cmake&#xff0c;cmake特性是獨立于源碼編譯&#xff0c;編譯工作可以在…

vb連接mysql未發現_vb連接MySQL遇到的問題解決方法

1.安裝mysql,2.安裝MyODBC-standard-3.51.07-win.msi3:vb連接語句是:Public strcnn As StringPublic sql As StringPublic conn A1.安裝mysql,2.安裝MyODBC-standard-3.51.07-win.msi3:vb連接語句是:Public strcnn As StringPublic sql As StringPublic conn As New ADODB.Conn…

mysql常用內置函數_mysql常見內置函數

在mysql中有許多內置的函數&#xff0c;雖然功能都能在PHP代碼中實現&#xff0c;但巧妙的應用mysql內置函數可以大大的簡化開發過程&#xff0c;提高效率。在這里我總結一下一些常用的&#xff0c;方便以后查看&#xff1a;mysql字符串函數&#xff1a;concat(String2 [,...])…