C++ map mutimap delete problem analysis

  • 2020-04-01 21:30:18
  • OfStack

This removal can lead to a series of unpredictable bugs such as program memory coverage

 
map<string, string>::iterator iter; 
for ( iter = mm.begin();iter != mm.end(); iter ++ ) 
{ 
if ( iter->second == something ) 
{ 
mm.erase( iter ); 
} 
} 

Reason: when iterator is erased and iterator ++ continues, things get messy
Correct method:
 
for (iter = mm.begin();iter != mm.end();) 
{ 
if ( iter->second == something ) 
{ 
mm.erase( iter++ ); 
} 
else 
{ 
iter++; // Use Pre Increment for efficiency. 
} 
} 

For those of you who don't understand mm. Erase (iterated ++)
It's the same thing as this
 
for (iter = mm.begin();iter != mm.end();) 
{ 
if ( iter->second == something ) 
{ 
map<string, string>::iterator iter_erase; 
iter_erase = iter++ //Save and then ++ and then delete
mm.erase( iter_erase ); 
} 
else 
{ 
iter++; // Use Pre Increment for efficiency. 
} 
} 


Related articles: