C++動態數組vector實現

最近在做將MATLAB代碼轉化爲C/C++的工作,在實際應用時,發現動態數組非常重要,我在學習的時候也踩了許多坑,這篇就當做一篇踩坑筆記,希望讀者能夠繞開我踩過的坑,順利應用動態數組。

1.靜態數組、動態數組

其實在C語言中,都是靜態數組,即需要在定義的時候就定下該數組的長度,然而這在實際的應用中,很大的一部分情況是我們並不知道數組的長度,因此沒有辦法聲明長度。此時我們就需要應用可以自動擴容的動態數組啦!
動態數組,它與靜態數組的最大區別是在定義的時候你可以不需要知道此時你定義的這個數組的具體長度,在你爲該數組賦值時,如果存儲空間不夠,它會自動擴容,也就是不需要擔心長度不夠,數組溢出啦。

2.vector定義一維動態數組

一開始,我選用過用new來定義一個動態數組,但是這種定義方式不是很方便,賦值很繁瑣,並且在使用過後你需要自己手動的去釋放內存,這對於懶懶的並且記性不好的我非常不友好。在我廣泛查閱資料後,我知道了vector這種方法,該方法簡單易上手,主要是不用手動釋放內存,就是效率有些低,但是總體來說用vector定義動態數組還是非常值得一試的!

(1)聲明
在你要使用vector這個容器時,你需要在代碼開頭的部分進行聲明,代碼如下:

#include<vector>
using namespace std;

(2)用vector定義一個一維數組
請看下面語句:

vector <int> n;

在這句代碼中,我利用vector定義了一個動態數組,名稱是 n ,這個數組中存儲的數據類型是int型。並不需要在此處指定數組的大小。
vector定義數組非常靈活,這裏的數據類型不僅僅侷限於int,double這種基本的數據類型,這裏甚至可以使結構。

(3)vector一維數組的賦值
一般情況vector動態數組都是利用for循環進行復制的。
例子:

vector <int> n;
int i;
for (i = 0; i<ALL_Length; i++) //其中ALL_Length可以是一個常數,也可以是變量,例如其他已經有值的動態數組長度
 {
  n.push_back(0);
 }

注意(新手常見錯誤):
① 使用 push_back 對動態數組進行初次賦值!
很多人在一開始的時候可能會這樣賦值 n[i] = x[j],這裏 n 和 x 都是一個一維數組,是想將 x 數組中的第 j 個值賦給 n 數組的第 i 個值。這個操作看似沒什麼問題,但是在debug的時候回出錯。錯誤的原因是在用vector定義了一個移位數組時,這個數組是空的,因此就沒有下標,所以不能直接對下標進行操作,要使用 push_back ,將要輸入的值一個一個按照次序輸入進去,就可以將代碼改寫爲n.push_back(x[j]);

② 創建的動態數組的長度問題
請看下面一段代碼:

//此段代碼存在問題,是典型的反例
vector <int> n;
int len_n = n.size();
int i;
for (i = 0; i<len_n; i++) //其中ALL_Length可以是一個常數,也可以是變量,例如其他已經有值的動態數組長度
 {
  n.push_back(0);
 }

此段代碼與上面賦值的代碼大致相同,只是該段代碼在用vector定義了一個動態數組 n 後,int len_n = n.size(); ,這行代碼本身是沒有任何語法錯誤的,但是它出現的位置缺不對。
在你用vector定義了一個動態數組後,緊接着就來了一句取數組長度的語句,請注意!此時你是定義了一個數組,但是你還沒有給它傳值,因此,此時你取到的數組長度是 0 !所以後續你想要用這個長度作爲範圍來進行數組賦值就會出錯,因爲範圍是0,所以根本這個循環就沒有進去,所以到時賦值失敗!

3.vector定義二維數組

具體定義形式如下:

 vector <vector <double> > m(8);

此時我定義了一個8行未知列數的矩陣,該矩陣的賦值與一維的情形類似,只是用了兩層for循環。

4.vector動態數組的一些操作

(1) n[i] //返回n的第i個值
(2) n.size(); //取數組長度
(3) n.push_back(); //存數據
(4) n.pop_back(); //刪除最後一個數據
(5) n.assign(x.begin(),x.end()); //將數組x的值賦給n,x.begin()是去x的首地址,x.end()是去x 的尾地址。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章