♥ 學習筆記Learning 程式語言 Coding

[C++程式設計] 學習筆記─容器 vector的使用(二維陣列與二維串列)

因為需要使用到vector,所以開始乖乖的研究vector的使用,由於才剛從C語言轉換到C++,對STL還不算頂熟,所以還在摸索,發現一些有趣的地方,順便記錄下來;請問vector<int> ivec(10); vector<int> ivec[10]; 有什麼差別呢?請回答…

boxing

答案是…

 1: vector<int> ivec(10);    // 宣告1個vector,裡面有10個int空間。
 2: vector<int> ivec[10];   // 宣告10個vector,每一個都可以存int。

所以,親愛的,小心一點,不要被中括號與小括號騙了。

為什麼會扯到這個問題呢?
因為,Rami在想著要寫二維動態增加的串列時,苦惱了很久。
然後,會看到這個寫法。

 1: vector<vector<int>> jvec(10);

這個寫法的意思,就是二維的vector喔!長相大概是這樣的~
vector1

可是因為我要寫的程式,是一串的鏈結陣列,每個長度都可能會不一樣。
因此,我改成了這樣宣告。

 1: vector<int> ivec[10];

vector2

因為vector的templete特性,所以可以當作一個動態鏈結串列使用。
上面的宣告方式,是宣告了十個vector,因此,當我要增加內容時,可以這樣用。

 1: vector<int> ivec[10];
 2: 
 3: int num1 = 10;
 4: int num2 = 20;
 5: 
 6: ivec[0].push_back(num1);
 7: ivec[0].push_back(num2);

 

上列圖示的結構就會產生這樣的變化。
vector3

同理,其他的ivec都可以這樣的使用,因此,可以變成一組長短不一的二維鏈結串列。
vector4
因此,我們也可以很輕易的算出,每一”條”ivec的長度為何。
譬如可以寫個這樣小小的迴圈來算一下。

 1: for(int i; i < 10; ++i){
 2:     cout << ivec[i].size() << endl;
 3: }

可不可以這麼隨便呢?XDDD

問題來了,請問,我要怎麼尋訪全部的元素呢?
事實上,如果要尋訪所有的元素,我們會透過iterator來尋訪。

首先,我們要搞清楚一件事,iterator是甚麼呢?
在概念上,有人說他像是陣列的索引(index),或者也有人說,他像是一個指標(pointer)。

在這裡,我建議大家把它想像成令人又愛又恨的指標吧! (紅筆重點畫得很奇怪…XDrz)

假如說,現在我想要尋訪ivec[4]裡面的元素,我通常會這樣寫的。

 1: vector<int>  :: iterator iter = ivec[4].begin();
 2: for(int ix = 0; iter != ivec[4].end(); ++iter, ++ix){
 3: 
 4:    cout << *iter << endl;
 5: }

意思就是說,我要將ivec[4]的內容,從頭到尾列印出來。^______^

問題又來了,那如果我要把所有的vector裏頭的值都列印出來呢?
看我鋪陳這麼久,就知道接下來的程式碼,就是上段與上上段的整合了。
可以這樣寫!^^”

 1: for(int iy; iy < 10; ++iy){
 2: 
 3:         vector<int>:: iterator iter = ivec[iy].begin();
 4:         for(int ix = 0; iter != ivec[iy].end(); ++iter, ++ix){
 5:                    cout << *iter << endl;
 6:         }
 7: 
 8: }

圖示的意義就是這樣,分別表示 ix iy 的意義,因為ix使用begin()與end()做為初始與終止條件,所以就會依照不同的長度,讀取到不同程度的資料囉!丟資料也一樣可以使用這個迴圈喔!^^
vector5

因為我還是C++程式的新手,所以一起交流吧!^ ^
希望跟我一樣的初學者也能獲得更多的幫助,感恩。


如果對你有幫助的話,歡迎留言跟我交流,或者是給我個推,當作是鼓勵囉!^ ^

About the author

蕾咪

蕾咪,來自台東,卻不定期旅居歐洲的工程師女孩,身兼作家、部落客、創業家等多重身份。畢業於台大電子所,曾在義大利商與美商擔任研發工程師;走訪世界後,發現對台灣有段割捨不了的愛,讓我們一起努力成為想要的自己吧!:) 合作邀稿請聯繫:ramihaha@gmail.com

15 Comments

Leave a Comment