作者BBSealion (海獅)
看板EE_DSnP
標題[問題] list中的itr
時間Tue Dec 7 23:34:14 2010
剛突然檢查到一個問題
list中
erase物件的話,我應該要把那個node上面的物件真的delete掉吧
不是只把point改一改而已
所以當我做
DList<AdtTestObj>::iterator itr;
itr = _container.begin();
...
之後如果我有erase到_container的第一個物件
_container的_head位置就會改變,且原本的位置上的東西被delete
那itr 基本上除非重新定義一次itr = _container.begin(); //把itr指到新的起始位置
不然他就會變成指到空的地方(begin的內容被delete了)
之後要是又去使用itr的資料就會crash了
但這一樣來
在跑for (itr = _container.begin(); itr != _container.end() ;itr++){...}
就變成不那麼直觀了
因為這中間不能去erase到開頭的物件,很奇怪...
---
照vector的邏輯
我如果
itr = _container.begin()
_container.erase(itr);
那這時
itr就會自動跑到新的begin()去了
也就是他偷偷多做了itr = _container.begin()這件事情
這樣來說
我的erase(iterator pos) 應該要改成 erase(iterator &pos)
才能在erase這個指令中去動到itr的位置吧
至於erase(T &x)
vector似乎沒支援這種用法,所以也不太清楚要做成什麼樣子比較好orz
---
問題有點混亂qq...
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.168.228.22
※ 編輯: BBSealion 來自: 218.168.228.22 (12/07 23:39)
1F:推 timrau:STL的玩法是讓return value為"指向parameter的後一個元素" 12/07 23:41
※ 編輯: BBSealion 來自: 218.168.228.22 (12/07 23:41)
2F:→ timrau:所以itr = _container.erase(itr); 就行了 12/07 23:42
3F:→ BBSealion:? erase的return是bool耶 12/07 23:47
4F:→ BBSealion:喔喔 你是說STL的做法 其實他不用耶 他ERASE就自動完成 12/07 23:48
5F:→ BBSealion:可以省略 itr = 這個步驟 12/07 23:50