C 動態陣列vector實現

2021-09-26 18:42:35 字數 2055 閱讀 5410

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

其實在c語言中,都是靜態陣列,即需要在定義的時候就定下該陣列的長度,然而這在實際的應用中,很大的一部分情況是我們並不知道陣列的長度,因此沒有辦法宣告長度。此時我們就需要應用可以自動擴容的動態陣列啦!

動態陣列,它與靜態陣列的最大區別是在定義的時候你可以不需要知道此時你定義的這個陣列的具體長度,在你為該陣列賦值時,如果儲存空間不夠,它會自動擴容,也就是不需要擔心長度不夠,陣列溢位啦。

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

(1)宣告

在你要使用vector這個容器時,你需要在**開頭的部分進行宣告,**如下:

#includeusing namespace std;
(2)用vector定義乙個一維陣列

請看下面語句:

vector n;
在這句**中,我利用vector定義了乙個動態陣列,名稱是 n ,這個陣列中儲存的資料型別是int型。並不需要在此處指定陣列的大小。

vector定義陣列非常靈活,這裡的資料型別不僅僅侷限於int,double這種基本的資料型別,這裡甚至可以使結構。

(3)vector一維陣列的賦值

一般情況vector動態陣列都是利用for迴圈進行複製的。

例子:

vector n;

int i;

for (i = 0; i注意(新手常見錯誤):

① 使用push_back對動態陣列進行初次賦值!

很多人在一開始的時候可能會這樣賦值n[i] = x[j],這裡 n 和 x 都是乙個一維陣列,是想將 x 陣列中的第 j 個值賦給 n 陣列的第 i 個值。這個操作看似沒什麼問題,但是在debug的時候回出錯。錯誤的原因是在用vector定義了乙個移位陣列時,這個陣列是空的,因此就沒有下標,所以不能直接對下標進行操作,要使用push_back,將要輸入的值乙個乙個按照次序輸入進去,就可以將**改寫為n.push_back(x[j]);

② 建立的動態陣列的長度問題

請看下面一段**:

//此段**存在問題,是典型的反例

vector n;

int len_n = n.size();

int i;

for (i = 0; i此段**與上面賦值的**大致相同,只是該段**在用vector定義了乙個動態陣列 n 後,int len_n = n.size();,這行**本身是沒有任何語法錯誤的,但是它出現的位置缺不對。

在你用vector定義了乙個動態陣列後,緊接著就來了一句取陣列長度的語句,請注意!此時你是定義了乙個陣列,但是你還沒有給它傳值,因此,此時你取到的陣列長度是0!所以後續你想要用這個長度作為範圍來進行陣列賦值就會出錯,因為範圍是0,所以根本這個迴圈就沒有進去,所以到時賦值失敗!

具體定義形式如下:

vector > m(8);

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

(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 的尾位址。

C語言實現 vector 動態陣列

ifndef cvector h define cvector h include include include define min len 256 define cvefailed 1 define cvesuccess 0 define cvepushback 1 define cvepop...

C 中vector動態陣列

目錄 0.寫在前面 1.基本操作 2.需求實現 2.1 reverse翻轉vector中元素 2.2 使用sort排序 2.3 列印vector的方式 2.4 構造乙個陣列,並且封裝為vector 3.vector作為引數的三種傳參方式 傳值 傳引用 傳指標 4.vector中begin end f...

VECTOR動態陣列

vector是同一種型別的物件的集合 vector的資料結構很像陣列,能非常高效和方便地訪問單個元素 vector是乙個類模板 class template 要使用vector必須包含相關標頭檔案 include using std vector 注 空間是連續的 空間是可以擴充套件的 貌似是矛盾的...