Я успешно использовал утилиты GNU для Win32 в течение достаточно долгого времени, и он имеет хороший grep, а также хвост и другую удобную гну utils для win32. Я избегаю упакованной оболочки и просто использую исполняемые файлы прямо в win32 командной строке.
Хвост, который упаковывается, является вполне хорошим небольшим приложением также.
После еще нескольких исследований и тестов я нашел решение. Очевидно, в соответствии со стандартом [24.4.1 / 1] связь между i.base () и i:
&*(reverse_iterator(i)) == &*(i - 1)
(из статьи доктора Доббса ):
Итак, вам нужно применить смещение при получении base (). Поэтому решение следующее:
m_CursorStack.erase( --(i.base()) );
РЕДАКТИРОВАТЬ
Обновление для C ++ 11.
reverse_iterator i
не изменился:
m_CursorStack.erase( std::next(i).base() );
reverse_iterator i
расширен:
std::advance(i, 1);
m_CursorStack.erase( i.base() );
Я считаю это намного яснее, чем мое предыдущее решение. Используйте то, что вам нужно.
При использовании reverse_iterator
метода base ()
и уменьшении результата здесь работает, стоит отметить, что reverse_iterator
s не имеют того же статуса, что и обычные итераторы
s. В общем, вы должны предпочесть обычный итератор
s reverse_iterator
s (а также const_iterator
s и const_reverse_iterator
s), чтобы точно причины вроде этого. См. Журнал доктора Доббса для более подробного обсуждения того, почему.