聊聊 std: list 的iterator 吧,该怎么处理
聊聊 std:: list 的iterator 吧
在公司遗留代码中,从没有遇到std库的使用,
最近有人引入了std:: list
对list的游标的使用不是很透彻
比如list<int* >l;
该list的iterator为 ite
l.remove(*ite)后
或l.erase(ite)
还能delete *ite?
是不是当list改变了之后, 原先获取到的游标就不应该再使用了?
------解决思路----------------------
当然不能再使用了。
list<int* >lst;
int *pI = *iter;
lst.erase(iter);
delete pl;
------解决思路----------------------
list::erase 不破坏现有 iterator,除了那些删除了的元素的迭代器。
其他作用在 *ite 上面的操作也不会破坏 list iterator.
------解决思路----------------------
不能。建议是使用, std::list<std::shared_ptr<int>>而不是std::list<int>, 不需要手动detete
------解决思路----------------------
建议看一下list的实现,不是很复杂。一般list删除部分数据都这样写
------解决思路----------------------
不懂的先看看教材吧,C++primer第四版中文版423页:
任何 insert 或 push 操作都可能导致迭代器失效。当编写循
环将元素插入到 vector 或 deque 容器中时,程序必须确保迭
代器在每次循环后都得到更新。
424页:
不要存储 end 操作返回的迭代器。添加或删除 deque 或
vector 容器内的元素都会导致存储的迭代器失效。
------解决思路----------------------
http://www.cplusplus.com
在公司遗留代码中,从没有遇到std库的使用,
最近有人引入了std:: list
对list的游标的使用不是很透彻
比如list<int* >l;
该list的iterator为 ite
l.remove(*ite)后
或l.erase(ite)
还能delete *ite?
是不是当list改变了之后, 原先获取到的游标就不应该再使用了?
------解决思路----------------------
当然不能再使用了。
list<int* >lst;
int *pI = *iter;
lst.erase(iter);
delete pl;
------解决思路----------------------
list::erase 不破坏现有 iterator,除了那些删除了的元素的迭代器。
其他作用在 *ite 上面的操作也不会破坏 list iterator.
------解决思路----------------------
不能。建议是使用, std::list<std::shared_ptr<int>>而不是std::list<int>, 不需要手动detete
------解决思路----------------------
建议看一下list的实现,不是很复杂。一般list删除部分数据都这样写
std::list<int*> intPtrList;
typedef std::list<int*>::iterator iterator;
for (iterator it = intPtrList.begin(); it != intPtrList.end();) {
if ( condition ) {
delete *it;
intPtrList.erase(it++);
} else {
++it;
}
}
------解决思路----------------------
不懂的先看看教材吧,C++primer第四版中文版423页:
任何 insert 或 push 操作都可能导致迭代器失效。当编写循
环将元素插入到 vector 或 deque 容器中时,程序必须确保迭
代器在每次循环后都得到更新。
424页:
不要存储 end 操作返回的迭代器。添加或删除 deque 或
vector 容器内的元素都会导致存储的迭代器失效。
------解决思路----------------------
http://www.cplusplus.com