base()
converte un iteratore inverso in avanti corrispondente iteratore. Tuttavia, nonostante la sua semplicità, questa corrispondenza non è così banale come potrebbe sembrare una cosa.
Quando un iteratore punti inversa a un elemento, esso dereference quella precedente, così l'elemento it fisicamente punti ae l'elemento che logicamente indica sono diversi. Nel diagramma seguente, i
è un iteratore in avanti, e ri
è un iteratore inverso costruita i
:
i, *i
|
- 0 1 2 3 4 -
| |
*ri ri
Quindi se ri
logicamente punti all'elemento 2
, indica fisicamente elemento 3
. Pertanto, quando viene convertito in un iteratore di inoltro, l'iteratore risultante punterà all'elemento 3
, che è quello che viene rimosso nell'esempio.
Il seguente piccolo programma illustra il comportamento precedente:
#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
}
Ecco un live example.
fonte
2013-05-17 12:32:17
Forse dovresti leggere questo: http://www.cplusplus.com/reference/iterator/reverse_iterator/base/ – JBL