Как назвать стирание с обратным итератором

Я успешно использовал утилиты GNU для Win32 в течение достаточно долгого времени, и он имеет хороший grep, а также хвост и другую удобную гну utils для win32. Я избегаю упакованной оболочки и просто использую исполняемые файлы прямо в win32 командной строке.

Хвост, который упаковывается, является вполне хорошим небольшим приложением также.

161
задан 0xC0DEFACE 2 December 2009 в 01:41
поделиться

2 ответа

После еще нескольких исследований и тестов я нашел решение. Очевидно, в соответствии со стандартом [24.4.1 / 1] связь между i.base () и i:

&*(reverse_iterator(i)) == &*(i - 1)

(из статьи доктора Доббса ):

alt text

Итак, вам нужно применить смещение при получении 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() );

Я считаю это намного яснее, чем мое предыдущее решение. Используйте то, что вам нужно.

163
ответ дан 23 November 2019 в 21:27
поделиться

При использовании reverse_iterator метода base () и уменьшении результата здесь работает, стоит отметить, что reverse_iterator s не имеют того же статуса, что и обычные итераторы s. В общем, вы должны предпочесть обычный итератор s reverse_iterator s (а также const_iterator s и const_reverse_iterator s), чтобы точно причины вроде этого. См. Журнал доктора Доббса для более подробного обсуждения того, почему.

3
ответ дан 23 November 2019 в 21:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: