在地图上快速擦除 [英] Fast Erase on Map

查看:84
本文介绍了在地图上快速擦除的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述




我知道如果你在迭代地图时调用擦除就会崩溃。

Ex:


map< int,doublem;

//插入内容

for(map< int,double> :: iterator i = m.begin(); i != m.end(); i ++)

if(i-> second< 0)m.erase(i);


这将崩溃因为erase()会破坏迭代器。我现在该怎么办?

将密钥插入列表并删除每个密钥。第一次循环后。有没有办法在同一个搜索循环中进行擦除?

Hi,

I know if you call erase when you iterate through map you will crash.
Ex:

map<int,doublem;
// insert something
for ( map<int, double>::iterator i = m.begin(); i != m.end(); i++ )
if ( i->second < 0 ) m.erase(i);

This will crash because erase() will corrupt iterator. Now what I do I
insert key into list and erase each key. After first loop. Is there way
to do this erase in the same search loop?

推荐答案


mo********@yahoo.com 写道:




我知道如果你在迭代地图时调用擦除就会崩溃。

Ex:


map< int,doublem;

//插入一些东西

for(map< int,double> :: iterator i = m.begin (); i!= m.end(); i ++)

if(i-> second< 0)m.erase(i);


这会崩溃因为erase()会破坏迭代器。我现在该怎么办?

将密钥插入列表并删除每个密钥。第一次循环后。有没有办法在同一个搜索循环中擦除?b $ b?
Hi,

I know if you call erase when you iterate through map you will crash.
Ex:

map<int,doublem;
// insert something
for ( map<int, double>::iterator i = m.begin(); i != m.end(); i++ )
if ( i->second < 0 ) m.erase(i);

This will crash because erase() will corrupt iterator. Now what I do I
insert key into list and erase each key. After first loop. Is there way
to do this erase in the same search loop?



擦除后不要递增迭代器 - 这是未定义的。


for(map< int,double>: :iterator i = m.begin(); i!= m.end(); / * NO

INCREMENT * /)

if(i-> second< ; 0)i = m.erase(i);

else

++ i;

/ Peter


peter koch写道:
peter koch wrote:
mo********@yahoo.com 写道:

>

我知道是否你在迭代地图时调用erase会崩溃。


map< int,doublem;
//插入一些东西
for(map< int, double> :: iterator i = m.begin(); i!= m.end(); i ++)
if(i-> second< 0)m.erase(i);

这会崩溃,因为erase()会破坏迭代器。现在我做什么
我将密钥插入列表并删除每个密钥。第一次循环后。是否有办法在同一个搜索循环中进行擦除?
>Hi,

I know if you call erase when you iterate through map you will crash.
Ex:

map<int,doublem;
// insert something
for ( map<int, double>::iterator i = m.begin(); i != m.end(); i++ )
if ( i->second < 0 ) m.erase(i);

This will crash because erase() will corrupt iterator. Now what I do
I insert key into list and erase each key. After first loop. Is
there way to do this erase in the same search loop?



擦除后不要递增迭代器 - 这是未定义的。


for(map< int,double>: :iterator i = m.begin(); i!= m.end(); / * NO

INCREMENT * /)

if(i-> second< ; 0)i = m.erase(i);

else

++ i;


Do not increment the iterator after an erase - this is undefined.

for ( map<int, double>::iterator i = m.begin(); i != m.end(); /* NO
INCREMENT */ )
if ( i->second < 0 ) i = m.erase(i);
else
++i;



std :: map :: erase不返回迭代器(尚未)。许多当前的SL

实现可能实际上有这个,但它不应该依赖

。成语是作为擦除调用的一部分递增:


if(i-> second< 0)m.erase(i ++);

else ++ i;

V

-

请在通过电子邮件回复时删除资本''A' />
我没有回复最热门的回复,请不要问

std::map::erase does NOT return an iterator (yet). Many current SL
implementations may actually have that, but it shouldn''t be relied
upon. The idiom is to increment as part of the call to erase:

if (i->second < 0) m.erase(i++);
else ++i;
V
--
Please remove capital ''A''s when replying by e-mail
I do not respond to top-posted replies, please don''t ask


您好,

mo ******** @ yahoo.com 写道:
Hello,

mo********@yahoo.com wrote:

map< int,doublem;

//插入内容

for(map< int,double> :: iterator i = m.begin(); i != m.end(); i ++)

if(i-> second< 0)m.erase(i);
map<int,doublem;
// insert something
for ( map<int, double>::iterator i = m.begin(); i != m.end(); i++ )
if ( i->second < 0 ) m.erase(i);



你必须在擦除前递增,例如


for(map< int,double> :: iterator i = m .begin(); i!= m.end();){

map< int,double> :: iterator j = i ++;

if(j-> ;第二个< 0)m.erase(j);

}


Bernd Strieder

You have to increment before erase, e.g.

for ( map<int, double>::iterator i = m.begin(); i != m.end(); ) {
map<int, double>::iterator j = i++;
if ( j->second < 0 ) m.erase(j);
}

Bernd Strieder


这篇关于在地图上快速擦除的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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