stdcxx-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Geoffrey Winn" <geoff.w...@googlemail.com>
Subject Re: Does a list iterator remain valid after removing an element in the list?
Date Thu, 07 Sep 2006 14:05:30 GMT
That did it. Thank you. We were indeed attempting to increment an iterator
that was already pointing at the_list.end(). I assume the other
implementations that we have used just silently leave the iterator
unchanged. Anyway, the whole Tuscany SDO test suite now runs successfully.

Geoff.

On 06/09/06, Martin Sebor <sebor@roguewave.com> wrote:
>
> 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
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message