精華區beta EE_DSnP 關於我們 聯絡資訊
※ 引述《starsky7372 (點點星空照上風)》之銘言: : 剛剛測試 dlistTest1.cpp : 用的是 STL 裡的 <list> : 發現下面這段 code : for (li = ll.begin(); li != ll.end(); ++li) : if (*li % 3 == 0) : li = ll.erase(li); : 如果改成這樣 : for (li = ll.begin(); li != ll.end(); ++li) { : if (*li % 3 == 0) { : cout << "erase " << *li << endl; : li = ll.erase(li); : } else : cout << *li << endl; : } : 會輸出下面這一段 : -40 : -22 : erase -6 : 20 : erase 30 : 44 : erase 48 : erase 51 : 59 : erase 66 : 86 : erase 99 : 131 : erase 150 : -40 : -22 : 8 : 20 : 38 : 44 : 50 : erase 54 : erase 75 : erase 114 : 覺得怪怪的, : 為什麼 delete 完 tail 後回傳的 iterator 再 ++ 會變回 head? : 如果照 pdf 的寫法,我們 delete 完應該回傳那個 node 的下一個 node : 所以 delete 掉 tail 是不是應該回傳 0? : 那麼 0 再 ++ 應該會出問題才對 ><" : 所以是我有那邊搞錯了嗎? : 感謝指正 : --- : PS: 教授早點睡喔 ^^ 1. STL 的 end 的確是再連到他的 begin... >> (data1) --> (data2)...(data_n) --> (@^#$&^) --> (data1) ^^^ ^^^ begin end 2. 問題是出在 ll.erase() 會 ++li, 所以如果 erase 的是最後一個 data, 在 erase() 完後 li 會等於 end(), 但是在 for loop 的結尾 li 又會 ++, 所以 li 又會指回 begin, 然後從繞一次... >> 是 dlistTest1.cpp 的 bug 啦!! Sorry~~~ 請改成 --- li = ll.begin(); while (li != ll.end()) { if (*li % 3 == 0) li = ll.erase(li); else ++li; } I will update the dlistTest1.cpp later... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.21.240
starsky7372:那我們需要實做end連回begin這個東西嗎? ^^" 12/06 00:17
ric2k1:不用啦 沒有必要 12/06 00:50