How to call erase with a reverse iterator
After some more research and testing I found the solution. Apparently according to the standard [24.4.1/1] the relationship between i.base() and i is:
&*(reverse_iterator(i)) == &*(i - 1)
(from a Dr. Dobbs article):
So you need to apply an offset when getting the base(). Therefore the solution is:
m_CursorStack.erase( --(i.base()) );
EDIT
Updating for C++11.
reverse_iterator i
is unchanged:
m_CursorStack.erase( std::next(i).base() );
reverse_iterator i
is advanced:
std::advance(i, 1);
m_CursorStack.erase( i.base() );
I find this much clearer than my previous solution. Use whichever you require.
Please note that m_CursorStack.erase( (++i).base())
may be a problem if used in a for
loop (see original question) because it changes the value of i. Correct expression is m_CursorStack.erase((i+1).base())
... or another way to remove this element from the list?
This requires the -std=c++11
flag (for auto
):
auto it=vt.end();
while (it>vt.begin())
{
it--;
if (*it == pCursor) //{ delete *it;
it = vt.erase(it); //}
}