Apoyo básico / C++17

Iteradores y rangos

Llevar al apunte ↗

Descripción

Un iterador señala una posición de una colección. Muchas operaciones de la STL reciben dos iteradores para elegir qué parte van a recorrer o devuelven un iterador al elemento encontrado. Un índice, en cambio, es un número de posición.

begin() señala el primer elemento y end() el límite posterior al último. El rango [inicio, fin) incluye el primero y excluye el segundo. Si una búsqueda devuelve end(), no encontró un elemento que puedas leer. En una colección vacía, begin() y end() son iguales.

*it permite leer el valor señalado. En un vector o string podés calcular una posición restando begin(). En un set o map el acceso se organiza por claves y sus iteradores permiten avanzar y retroceder, pero no esa resta. auto permite guardar cada resultado con su tipo correcto.

Funciones y operaciones

Uso Resultado o condición
v.begin() / v.end() Inicio / fin excluido del rango
*it Elemento señalado por un iterador válido
it->first / it->second Campos de un par señalado por el iterador
++it Avanza una posición, cuando hay un siguiente límite válido
v.begin() + i Posición i en vector o string, con 0 <= i <= size()
it - v.begin() Índice de un iterador del mismo vector o string
v.rbegin() / v.rend() Inicio / fin de un recorrido inverso

Ejemplos

Pasar de una búsqueda al valor y su posición

vector<int> v = {8, 3, 5};
auto it = find(v.begin(), v.end(), 3);
if (it != v.end()) {
    int valor = *it; // 3
    int posicion = static_cast<int>(it - v.begin()); // 1
}

Elegir un tramo

vector<int> v = {8, 3, 5, 2};
int cantidad = count(v.begin() + 1, v.begin() + 3, 5); // 1
// El tramo contiene los valores 3 y 5.

Comparar con la búsqueda propia de string

string s = "CASA";
auto posicion = s.find('S'); // Índice 2
auto it = find(s.begin(), s.end(), 'S'); // Iterador al carácter

La primera se compara con string::npos. La segunda se compara con s.end().

Recorrer un set

set<int> valores = {7, 2, 10};
for (auto it = valores.begin(); it != valores.end(); ++it) {
    cout << *it << ' ';
}
// Salida: 2 7 10

Al editar una colección, algunos iteradores pueden dejar de ser válidos. En un vector, insertar o borrar puede desplazar elementos. En un set, borrar invalida el iterador del elemento quitado. Usá el resultado de la operación o volvé a buscar la posición que necesitás.