Vector::erase не работает с обратными итераторами?
Следующий код не скомпилируется
some_vector.erase(some_vector.rbegin(), some_vector.rbegin()+1);
Это всего лишь пример, я знаю, что есть лучший вариант для удаления последних n элементов. GCC сообщает мне, что для стирания нет соответствующей функции. Я сделал что-то не так или стирание не работает с обратными итераторами? Работает нормально с прямым итератором, хотя
1 ответ
Это не. Однако обратные итераторы обеспечивают base()
метод получения прямого итератора. Обратите внимание, что возвращенный прямой итератор указывает на элемент, следующий за элементом, на который указывает обратный итератор.
Или, другими словами, .rbegin().base() == .end()
а также .rend().base() == .begin()
Таким образом, исправленный код будет выглядеть так:
some_vector.erase(
(++(some_vector.rbegin())).base(),
some_vector.rbegin().base()
);
Обратите внимание, что мы должны поменять местами порядок итераторов, поскольку они являются обратными итераторами; второй аргумент должен быть итератором, который следует за первым итератором в последовательности, но без замены порядка обратных итераторов это не будет правдой. Так что, если у нас есть два обратных итератора a
а также b
, а также b >= a
тогда мы можем использовать эту идиому для erase()
:
container.erase(b.base(), a.base());
В более общем смысле для диапазона обратных итераторов [a, b) справедливо, что range [b.base(), a.base()) повторяет одну и ту же последовательность элементов в обратном порядке.