因為需要使用到vector,所以開始乖乖的研究vector的使用,由於才剛從C語言轉換到C++,對STL還不算頂熟,所以還在摸索,發現一些有趣的地方,順便記錄下來;請問vector<int> ivec(10); 與 vector<int> ivec[10]; 有什麼差別呢?請回答…
答案是…
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喔!長相大概是這樣的~
可是因為我要寫的程式,是一串的鏈結陣列,每個長度都可能會不一樣。
因此,我改成了這樣宣告。
1: vector<int> ivec[10];
因為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);
同理,其他的ivec都可以這樣的使用,因此,可以變成一組長短不一的二維鏈結串列。
因此,我們也可以很輕易的算出,每一”條”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()做為初始與終止條件,所以就會依照不同的長度,讀取到不同程度的資料囉!丟資料也一樣可以使用這個迴圈喔!^^
因為我還是C++程式的新手,所以一起交流吧!^ ^
希望跟我一樣的初學者也能獲得更多的幫助,感恩。
—
如果對你有幫助的話,歡迎留言跟我交流,或者是給我個推,當作是鼓勵囉!^ ^
非常清楚!
謝謝分享
感謝 我學到很多
在這裡,我建議大家把它想像成令人又愛又恨的指標吧! (紅筆重點畫得很奇怪…XDrz)
=> 這邊如果container是vector可以把iterator當作pointer是OK的,但是若是在其他種類的container的iterator不一定是poniter。
vector的iterator是pointer,list的iterator就不是pointer,這邊有討論可以參考。
http://www.cnblogs.com/oomusou/archive/2008/07/21/stl_iterator_pointer.html
jhanggj
2017/07/24
謝謝你的筆記,感激不盡~~對作業很有幫助!!!
很實用~~
哈哈 看了你的IP,是台大的學弟吧!XD
很高興對你有幫助!!!^^
簡單明瞭的教學我喜歡
感謝您
會持續追蹤的!
哈 之前念碩班寫的筆記,沒想到隔了這麼久還有人在看。:)
近期比較少分享程式心得了,不過也歡迎來交流喔!
這篇文章幫我大忙,跟vector相見恨晚,不然以前用array還要用額外的變數紀錄元素數量,
而且清空也變得方便多了,直接用vector.clear()。
哈哈 不管怎麼樣,使用Array的經驗,可以讓基本功更紮實也不錯啊!:)
原本都是一直使用C語言,後來為了加快演算法的開發速度,才開始學C++的。
使用vector的確省下了不少基礎資料結構實作的時間~~^^
我記得,使用clear本身的定義可能要再看看,最好在學習clear的用法時,試著和erase比較一下,可以釐清不少觀念喔!
請問內文當中的二維vector寫法是不是有寫錯
通常我會用Compiler 測試過才寫上去。XD
不過這篇有點久了,妳可以測看看,有錯的話,感謝你的指正。
原本是vector<vector> jvec(10);
會出現錯誤,改成這樣可以正確執行
vector<vector > jvec(10);
好像是中間要空一格,不然會和input operator混在一起
感謝你PO了這篇文,幫助很大
總算可以正式和Arrays說再見了XD
恩恩 感謝!!^^
哈哈 也感謝你提供這樣的資訊。^^
可能寫Code時有注意,貼過來排版跑掉了。