How can I remove elements from an std::set
while iterating over it
My first attempt looks like:
set<T> s;
for(set<T>::iterator iter = s.begin(); iter != s.end(); ++iter) {
//Do some stuff
if(/*some condition*/)
s.erase(iter--);
}
But this is problematic if we want to remove the first element from the set because iter--
invalidates the iterator.
What's the standard way to do this?
Standard way is to do something like
for(set<T>::iterator iter = s.begin(); iter != s.end();)
{
if(/*some condition*/)
{
s.erase(iter++);
}
else
{
++iter;
}
}
By the first condition we are sure, that iter
will not be invalidated anyway, since a copy of iter
will be passed into erase, but our iter
is already incremented, before erase is called.
In C++11, the code will be like
for(set<T>::iterator iter = s.begin(); iter != s.end();)
{
if(/*some condition*/)
{
iter = s.erase(iter);
}
else
{
++iter;
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With