Re: simple vector question
In article <yeQBg.4828$9T3.1423@newssvr25.news.prodigy.net>, red floyd
<no.spam@here.dude> wrote:
Quoth Alex, nevermore:
You are right. This would be a proper way to deal with that portion of
the code:
for (std::vector<BmTrack*>::iterator it = tracks.begin(); it !=
tracks.end();)
{
if ((*it)->isDead())
{
delete *it;
it = tracks.erase(it);
}
else ++it;
}
The code above assumes implementation of isDead() member function in
BmTrack instead of using dead_track array.
std::vector<BmTrack*>::iterator it = std::remove_if(
tracks.begin(),
tracks.end(),
std::mem_fun_ptr(&BmTrack::isDead));
for (std::vector<BmTrack*>::iterator it1 = it;
it != tracks.end();
++it)
delete (*it);
tracks.erase(it, tracks.end());
That way, you don't have to remember the semantics.
Ouch!! Most implementations of remove_if that way will cause memory
leaks by overwriting pointers removed by ptrs that are wanted without
deleteing the removed items.
BmTrack * delete_if_dead(BmTrack *p)
{
if(p->isDead())
{
delete p;
p = 0;
}
return p;
}
std::transform(tracks.begin(),tracks.end(),tracks.begin(),delete_if_dead)
;
tracks.erase
(
std::remove(tracks.begin(),tracks.end(),(BmTrack *)0),
tracks.end()
);
is safer, if you don't like walking the same container twice, writing
an output_iterator that does the work and copy the vector to 'itself'
via the output_iterator, or a for loop to do it.
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]