Re: Using std::set::erase with iterators
On Mar 3, 2:43 pm, mathieu <mathieu.malate...@gmail.com> wrote:
Hi,
I do not understand how I am supposed to use erase when looping over
elements in a set, here is what I am trying to do (*). Could someone
please indicate how was I supposed to do it properly ? All I can think
of is something like this (very cumbersome):
if( *it % 2 )
{
std::set<int>::const_iterator duplicate = it;
++it;
s.erase( duplicate );
}
else
{
++it;
}
You could use the returned iterator out of the erase call. Like this:
for( std::set<int>::iterator it = s.begin(); it != s.end(); )
{
if( *it % 2 )
it = s.erase( it );
else
++it;
}
std::set is node-base, so erasing an element does not invalidate all
iterators, it just makes the removed item's iterator invalid and so
you cannot advance it with operator++() as your original for-loop is
doing:
for( std::set<int>::const_iterator it = s.begin(); it != s.end(); +
+it)
{
if( *it % 2 )
s.erase( it ); //--->> Here you erase it and then use the same
'it' to advance as ++it.
}