funcion español c++ vector erase

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í?


base() devuelve el iterador base subyacente.

El iterador base se refiere al elemento que está junto al elemento al que está apuntando reverse_iterator actualmente. Eso es std::reverse_iterator(it).base() == std::next(it) .

Puedes aprender más sobre reverse_iterator here .

here