Re: [分享] C++的學習筆記 (for 超新手)

看板C_and_CPP作者 (電子學)時間14年前 (2012/01/27 10:16), 編輯推噓4(4055)
留言59則, 8人參與, 最新討論串3/3 (看更多)
※ 引述《mitiyiyi (米提)》之銘言: : 冏 看到這篇文大家的回饋,突然覺得自己應該來面對現實一下。 : 因為自己也會在網誌上稍微記錄一下,自己的C++學習筆記~ : 不過因為手邊有一個專案,所以是隨著需求來做紀錄~ : 想想也擔心會造成他人的誤導Orz||| 畢竟自己的觀念很薄弱。 : 程式設計 分類 http://ramihaha.pixnet.net/blog/category/1473791 : 最近的幾篇~ : [C++程式設計] 學習筆記─容器 vector的使用(二維陣列與二維串列) : http://ramihaha.pixnet.net/blog/post/27670857 : [C++程式設計] 學習筆記-物件導向之class, object, instance的差別 : http://ramihaha.pixnet.net/blog/post/27656429 ............................. ----------------------------------------------------------------- 你好,小弟我也是新手 看了一下你的vector的使用,發現了幾個錯誤~ 在動態二維陣列那邊,vector<vector<int>> jvec(10)那邊編譯是不會過得, 要改成vector<vector<int> > jvec(10),右邊兩個箭號要空格,不然編譯器 會以為是串流運算子 還有要初始化一個10X10的動態二維陣列應該是 vector<vector<int> > jvec(10,vector<int>(10) ) 如果寫成vector<vector<int> > jvec(10)的話會建構成一個外層10個元素 內層為空集合的二維陣列(cout出來看就很明顯了~~) 這是我目前看到的錯誤,身為新手的我們加油吧>O< -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.39.62.104

01/27 10:59, , 1F
vector<vector<int> > 這裡,不知道你用的是哪一種編譯
01/27 10:59, 1F

01/27 11:00, , 2F
器或是IDE?
01/27 11:00, 2F

01/27 11:08, , 3F
我是用codeblocks,如有什麼錯誤請跟小弟講,才疏學淺
01/27 11:08, 3F

01/27 11:11, , 4F
gcc加上-std=c++0x後可以不加空格
01/27 11:11, 4F

01/27 11:14, , 5F
加空格是c++本身要求的
01/27 11:14, 5F

01/27 11:17, , 6F
vector的話, C++ 標準不同, 判斷方法不一樣...
01/27 11:17, 6F

01/27 11:18, , 7F
舊的編譯器會把>>直接當成operator, 新版的會比較聰明
01/27 11:18, 7F

01/27 11:18, , 8F
vector多維陣列有保證被存放的資料記憶體連續嗎????
01/27 11:18, 8F

01/27 11:18, , 9F
但原則上還是建議用舊式的寫法較佳
01/27 11:18, 9F

01/27 11:19, , 10F
vector並不保證記憶體的連續性...
01/27 11:19, 10F

01/27 11:21, , 11F
還有每個vector長度不一樣跟 vector 的 vector 有關係?
01/27 11:21, 11F

01/27 11:22, , 12F
iterator 想像成 pointer 可能會在STL很多情形下出錯
01/27 11:22, 12F

01/27 11:28, , 13F
vector 須保持空間連續性吧~ 是增減元素時間點不固定
01/27 11:28, 13F

01/27 11:30, , 14F
建議查書或GOOGLE~
01/27 11:30, 14F

01/27 11:30, , 15F
簡單一個問題~ just問問 宣告vector<vector<int> >時
01/27 11:30, 15F

01/27 11:31, , 16F
內層vector append元素 外層會變動嗎
01/27 11:31, 16F

01/27 11:32, , 17F
其他文中網頁內容我沒細看,就不亂說了 XD
01/27 11:32, 17F

01/27 11:32, , 18F
簡單說 當內層因為reserved空間不足而重新alloc外層會變?
01/27 11:32, 18F


01/27 11:33, , 20F
their elements stored in contiguous storage location.
01/27 11:33, 20F

01/27 11:33, , 21F
那為什麼改動 vector 有可能使先前的 iterator 失效呢?
01/27 11:33, 21F

01/27 11:34, , 22F
連續性?模擬一維陣列還是多維陣列?
01/27 11:34, 22F

01/27 11:35, , 23F
vector是吃 random access iterator的
01/27 11:35, 23F

01/27 11:36, , 24F
their elements can be accessed not only using iterato
01/27 11:36, 24F

01/27 11:36, , 25F
s but also using offsets on regular pointers...
01/27 11:36, 25F

01/27 11:37, , 26F
如果vector append超過reserved數量 當然要realloc阿..
01/27 11:37, 26F

01/27 11:43, , 27F
超過"allocated storage space"還是reserve(n)的n?
01/27 11:43, 27F

01/27 11:49, , 28F
我也不知道答案,我只會一直丟問題 XD
01/27 11:49, 28F

01/27 11:51, , 29F
原po如果找到答案也許可以分享一下 ^^
01/27 11:51, 29F

01/27 12:28, , 30F
空格問題c++11新標準http://ppt.cc/T7pQ
01/27 12:28, 30F

01/27 12:42, , 31F
http://ideone.com/mlx8K 我測出來的結果
01/27 12:42, 31F

01/27 12:43, , 32F
會連續,但不一定在原本的地方連續下去,可能整個
01/27 12:43, 32F

01/27 12:43, , 33F
搬動到別的位址
01/27 12:43, 33F

01/27 12:46, , 34F
vector空間分成size跟capacity,size是目前使用的
01/27 12:46, 34F

01/27 12:46, , 35F
capacity是預留的空間,當size超過capacity就要
01/27 12:46, 35F

01/27 12:48, , 36F
reserve來改變capacity,至於n要用多少就看實作方式
01/27 12:48, 36F

01/27 23:39, , 37F
個人覺得vector記憶體位置應該是連續的,不然用iterator迭代
01/27 23:39, 37F

01/27 23:40, , 38F
遍訪容器時寫的++iterator應該就不會成立
01/27 23:40, 38F

01/27 23:41, , 39F
而說到iterator失效小弟最近剛好中這個bug,根據我de完的結
01/27 23:41, 39F

01/27 23:43, , 40F
iterator 有分random/bidirection/forward 多種...
01/27 23:43, 40F

01/27 23:44, , 41F
++可以作用有序集合上... vector/list/queue的itor都有++
01/27 23:44, 41F

01/27 23:49, , 42F
果跟diab大大一樣,初始allocator配置一塊連續的記憶體,即
01/27 23:49, 42F

01/27 23:51, , 43F
抱歉,我沒看過iterator的實作版本,所以我不太清楚他的
01/27 23:51, 43F

01/27 23:52, , 44F
operator++是怎麼寫的,所以說vector有可能是非連續空間??
01/27 23:52, 44F

01/27 23:59, , 45F
說到iter失效的問題,根據我de完的結果加上primer的p756~,
01/27 23:59, 45F

01/28 00:00, , 46F
問題就跟diab大大說的一樣,你使用的空間超過超過allocator
01/28 00:00, 46F

01/28 00:02, , 47F
設置的空間(capacity),會喚起reallocate配置一塊更大的空間
01/28 00:02, 47F

01/28 00:04, , 48F
(2*capacity??),實做上會喚起uninitialized_copy複製舊資料
01/28 00:04, 48F

01/28 00:06, , 49F
到新配置的空間,然後再喚起destroy清除舊資料,所以說iter失
01/28 00:06, 49F

01/28 00:07, , 50F
效是因為資料被搬走了,不知道我這樣講有沒有錯?
01/28 00:07, 50F

01/28 00:23, , 51F
01/28 00:23, 51F

01/28 00:24, , 52F
A pointer to the reallocated memory block, which may
01/28 00:24, 52F

01/28 00:24, , 53F
be either the same as the ptr argument or a new locat
01/28 00:24, 53F

01/28 17:06, , 54F
一維vector保證連續,這就是為什麼vector可以提供給
01/28 17:06, 54F

01/28 17:07, , 55F
C-array的API使用,但是就像二維array不保證其中的每個
01/28 17:07, 55F

01/28 17:07, , 56F
一維連續一樣,二維vector也不一定會全都連續
01/28 17:07, 56F

01/28 17:09, , 57F
至於h9602b講的++iter和這個無關,跟iter type有關
01/28 17:09, 57F

01/28 17:10, , 58F
雖然現在大部分vector實作是直接用ptr當iter就是了
01/28 17:10, 58F

01/28 17:12, , 59F
(補充一下樓樓樓上, 每個一維"之間")
01/28 17:12, 59F
文章代碼(AID): #1F8WZplP (C_and_CPP)
文章代碼(AID): #1F8WZplP (C_and_CPP)