Re: Deleting items from an std::list , is this code correct?
In article
<6eaa63d2-cb20-432a-a500-dc610e9f877b@u12g2000prd.googlegroups.com>,
Greg Herlihy <greghe@mac.com> 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! ]