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.
}
}