Re: Using std::set::erase with iterators
On 3 B=F8e, 10:43, 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;
}
Thanks
-Mathieu
(*)
#include <set>
#include <iostream>
int main()
{
std::set<int> s;
for(int i =0; i < 10; ++i)
{
s.insert( i );
}
for( std::set<int>::const_iterator it = s.begin(); it != s.end(); +
+it)
{
if( *it % 2 )
s.erase( it );
}
for( std::set<int>::const_iterator it = s.begin(); it != s.end(); +
+it)
{
std::cout << *it << std::endl;
}
return 0;
}
If you erase some item, iterators become invalid. So you cannot
continue with the cycle driven by invalid iterators.
Use std::remove_if and std::set::erase(std::remove_if(begin, end,
condition), end) instead. (begin and end are range limits in your set)