stdcxx-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Martin Sebor <se...@roguewave.com>
Subject Re: Does a list iterator remain valid after removing an element in the list?
Date Wed, 06 Sep 2006 16:16:39 GMT
Geoffrey Winn wrote:
> I'm investigating an abort that I get from a Tuscant SDO test prgram when
> built using stdcxx. I still have some investigation to do however based on
> the code I've read I'd like to clarify the following.
> 
> If I have a std::<list> and I've created an iterator to examine each 
> item in
> the list in turn, if I then use erase to delete one of those items eg
> 
> iter = the_list.erase(iter);
> 
> does the iterator remain valid?

No, erase() invalidates all iterator(s) that point to the erased
elements. However, the value returned from erase() is a valid,
although not necessarily dereferenceable iterator (it may be
end()).

> 
> I'm asking this because the abort occurs in an assert statement within the
> implementation of the ++ operator for the iterator.

That's probably (hopefully :-) our "safe iterator" feature kicking
in to let you know that you're trying to increment an iterator past
the end of a sequence).

FWIW, here's how to safely erase all elements to the end of a list.

#include <list>

int main ()
{
     const int a[] = { 1, 2, 3, 4 };
     std::list<int> x (a, a + sizeof a / sizeof *a);

     std::list<int>::iterator it = x.begin ();
     while (it != x.end ())
         it = x.erase (it);
}

Martin

Mime
View raw message