作者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