How to call erase with a reverse iterator

c++

Solution

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.

Problem

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?

Original source

Related problems