In article
<6eaa63d2-cb20-432a-a500-dc610e9f877b@[EMAIL PROTECTED]
>,
Greg Herlihy <greghe@[EMAIL PROTECTED]
> wrote:
> Calling std::remove_if() on a std::list can invalidate the list's
> iterators (meaning that after the call to remove_if() - each iterator
> in the list might no longer reference the same value bas it did before
> the call)
True the iterators of the 'removed' items are invalid, but the
iterators to the remaining ones are valid.
bool is_even(int);
std::list<int> foo;
for(int i=0;i!=10;++i) foo.push_back(i); // list = {0,1,2,3,4,5,..9{
std::list<int>::iterator last = std::remove_if(foo.begin(),foo.end(),
is_even);
list is now {1,3,5,7,9,j,k,k,k,k} still 10 entries but only first 5
[last points to j] are in the sequence. all iterators in
[foo.begin(),last) are valid.
If you want the garbage [denote as j or k above] then call erase with
two iterators or better still use the list::remove_if() member function
and the items will be physically removed from the list in one pass that
is foo.remove_if(is_even); will make foo.size() == 5 while
std::remove_if(...) will leave foo.size()==10,
--
[ See http://www.gotw.ca/resources/clcm.htm
for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]


|