base()
преобразует обратный итератор в соответствующий вперед итератора. Однако, несмотря на свою простоту, эта переписка не такая тривиальная, как одна вещь.
При обратном точки итератора на одном элементе, он разыменовывает предыдущий, поэтому он элемент физически указывает на элемент и он логически указывает на разные. На следующей диаграмме, i
является прямым итератора, и ri
является обратным итератора построена из i
:
i, *i
|
- 0 1 2 3 4 -
| |
*ri ri
Так что если ri
логически указывает на элемент 2
, он физически указывает на элемент 3
. Поэтому при преобразовании в форвардный итератор результирующий итератор будет указывать на элемент 3
, который будет удален в вашем примере.
Следующая небольшая программа демонстрирует выше поведение:
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
int main(int argc, char *argv[])
{
std::vector<int> v { 0, 1, 2, 3, 4 };
auto i = find(begin(v), end(v), 2);
std::cout << *i << std::endl; // PRINTS 2
std::reverse_iterator<decltype(i)> ri(i);
std::cout << *ri << std::endl; // PRINTS 1
}
Вот является live example.
Возможно, вам стоит прочитать следующее: http://www.cplusplus.com/reference/iterator/reverse_iterator/base/ – JBL