删除STL列表条目 - 是否所有迭代器都失效? [英] Deleting STL list entry - are all iterators invalidated?

查看:62
本文介绍了删除STL列表条目 - 是否所有迭代器都失效?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好


我需要遍历STL列表容器并删除其中的某些

条目。我意识到如果使用带有迭代器的erase()它将会使它失效但是如果我事先存储它会怎么样?即:是下面的代码

使用第二个迭代器变量总是保证工作或者可以在那个内部实现魔法进入内部实现魔法

可以阻止它吗?


for(iter = objlist.begin(); iter!= objlist.end(); ++ iter)

{

iter2 = iter;

obj = * iter;

obj-> run();

if(obj-> destroy_me)

{

objlist.erase(iter);

delete obj;

iter = iter2;

}

}


感谢您的帮助。


B2003

解决方案



Boltar写道:


for(iter = objlist.begin(); iter!= objlist.end(); ++ iter)

{

iter2 = iter;

obj = * iter;

obj-> run();

if(obj-> destroy_me)

{

objlist.erase(iter);

删除obj;

iter = iter2;

}

}



很抱歉,这是我剪切和粘贴的一些旧代码,它应该是:


for(iter = objlist.begin(); iter!= objlist.end(); )

{

iter2 = iter

iter2 ++;

obj = * iter;

obj-> run();

if(obj-> destroy_me)

{

objlist.erase(iter);

删除obj;

iter = iter2;

}

else iter ++;

}


B2003




Boltar写道:
< blockquote class =post_quotes>
Hello


我需要遍历STL列表容器并删除其中的某些

条目。我意识到如果使用带有迭代器的erase()它将会使它失效但是如果我事先存储它会怎么样?即:是下面的代码

使用第二个迭代器变量总是保证工作或者可以在那个内部实现魔法进入内部实现魔法

可以阻止它吗?


for(iter = objlist.begin(); iter!= objlist.end(); ++ iter)

{

iter2 = iter;

obj = * iter;

obj-> run();

if(obj-> destroy_me)

{

objlist.erase(iter);

delete obj;

iter = iter2;

}

}



只要程序调用std :: list'自己的erase()例程(如上面的

示例代码所示)从列表中删除元素,然后只有
传递给erase()的迭代器将失效。特别是

,同一个列表容器中的所有其他迭代器仍然有效,并且仍然会引用与之前相同的列表元素。


Greg


Boltar写道:


>

Boltar写道:


> for(iter = objlist.begin(); iter!= objlist.end(); ++ iter)
{
iter2 = iter;
obj = * iter;
obj-> run();
if(obj-> destroy_me)
{
objlist.erase(iter);
删除obj;
iter = iter2;
}
}



对不起,这是我剪切和粘贴的一些旧代码,它应该是:


for(iter = objlist.begin(); iter!= objlist.end();)

{

iter2 = iter

iter2 ++;

obj = * iter;

obj- > run();

if(obj-> destroy_me)

{

objlist.erase(iter);

delete obj;

iter = iter2;

}

其他iter ++;

}



这不仅仅是与erase()一起使用的迭代器,它被无效,

,而是擦除元素的所有迭代器。想一想:iter2

指的是一个不再存在的元素。它怎么可能有效?

提示:看一下erase()的返回值。


Hello

I need to iterate through an STL list container and delete certain
entries in it. I realise if use erase() with the iterator it will
invalidate it but what if I store it beforehand? Ie: is the code below
using a 2nd iterator variable always guaranteed to work or could there
be come internal implementation magic going on inside the list that
could prevent it?

for(iter=objlist.begin();iter != objlist.end();++iter)
{
iter2 = iter;
obj = *iter;
obj->run();
if (obj->destroy_me)
{
objlist.erase(iter);
delete obj;
iter = iter2;
}
}

Thanks for any help.

B2003

解决方案


Boltar wrote:

for(iter=objlist.begin();iter != objlist.end();++iter)
{
iter2 = iter;
obj = *iter;
obj->run();
if (obj->destroy_me)
{
objlist.erase(iter);
delete obj;
iter = iter2;
}
}

Sorry , that was some old code I cut and pasted , it should have read:

for(iter=objlist.begin();iter != objlist.end();)
{
iter2 = iter
iter2++;
obj = *iter;
obj->run();
if (obj->destroy_me)
{
objlist.erase(iter);
delete obj;
iter = iter2;
}
else iter++;
}

B2003



Boltar wrote:

Hello

I need to iterate through an STL list container and delete certain
entries in it. I realise if use erase() with the iterator it will
invalidate it but what if I store it beforehand? Ie: is the code below
using a 2nd iterator variable always guaranteed to work or could there
be come internal implementation magic going on inside the list that
could prevent it?

for(iter=objlist.begin();iter != objlist.end();++iter)
{
iter2 = iter;
obj = *iter;
obj->run();
if (obj->destroy_me)
{
objlist.erase(iter);
delete obj;
iter = iter2;
}
}

As long as the program calls std::list''s own erase() routine (as the
sample code above does) to remove the element from the list, then only
the iterator that was passed to erase() will be invalidated. In
particular, all other iterators in that same list container remain
valid and will still reference the same list element as before.

Greg


Boltar wrote:

>
Boltar wrote:

>for(iter=objlist.begin();iter != objlist.end();++iter)
{
iter2 = iter;
obj = *iter;
obj->run();
if (obj->destroy_me)
{
objlist.erase(iter);
delete obj;
iter = iter2;
}
}


Sorry , that was some old code I cut and pasted , it should have read:

for(iter=objlist.begin();iter != objlist.end();)
{
iter2 = iter
iter2++;
obj = *iter;
obj->run();
if (obj->destroy_me)
{
objlist.erase(iter);
delete obj;
iter = iter2;
}
else iter++;
}

It''s not just the iterator that you used with erase() that''s invalidated,
but rather all iterators to the erased element. Think about it: iter2
refers to an element that doesn''t exist anymore. How could it be valid?
Hint: Have a look at the return value of erase().


这篇关于删除STL列表条目 - 是否所有迭代器都失效?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆