español - c++ stl lo que hace la base()
funcion count en c++ (2)
base()
convierte un iterador inverso en el iterador directo correspondiente. Sin embargo, a pesar de su simplicidad, esta correspondencia no es tan trivial como se podría pensar.
Cuando un iterador inverso apunta a un elemento, elimina la referencia del anterior, de modo que el elemento al que apunta físicamente y el elemento al que apunta lógicamente son diferentes. En el siguiente diagrama, i
es un iterador directo, y ri
es un iterador inverso construido a partir de i
:
i, *i
|
- 0 1 2 3 4 -
| |
*ri ri
Entonces, si ri
apunta lógicamente al elemento 2
, físicamente apunta al elemento 3
. Por lo tanto, cuando se convierte a un iterador directo, el iterador resultante apuntará al elemento 3
, que es el que se elimina en su ejemplo.
El siguiente programa pequeño demuestra el comportamiento anterior:
#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
}
Aquí hay un ejemplo en vivo .
Tengo tal código:
vector <int> v;
for (int i=0; i<5; i++)
v.push_back(i);
v.erase(find(v.rbegin(), v.rend(),2).base());
Este código elimina el primer elemento del vector v después de la primera detección de 2 (en el vector permanece: 0 1 2 4). ¿Qué hace .base () aquí?