作者ric2k1 (Ric)
看板EE_DSnP
標題Re: [問題] dlist 的 erase()
時間Mon Dec 5 17:58:56 2005
※ 引述《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