I am trying to do something like this:
for ( std::list< Cursor::Enum >::reverse_iterator i = m_CursorStack.rbegin(); i != m_CursorStack.rend(); ++i )
{
if ( *i == pCursor )
{
m_CursorStack.erase( i );
break;
}
}
However erase takes an iterator and not a reverse iterator. is there a way to convert a reverse iterator to a regular iterator or another way to remove this element from the list?
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
Updated for C++11, two additional solutions:
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 these much clearer than my previous solution. Use whichever you require.