c++

How to call erase with a reverse iterator


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?


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:

    I find these much clearer than my previous solution. Use whichever you require.