Menu
Coddy logo textTech

Iteradores

Parte de la sección Programación Orientada a Objetos del Journey de C++ de Coddy — lección 72 de 104.

Los iteradores son objetos que actúan como un puente entre los contenedores y los algoritmos. Proporcionan una forma uniforme de acceder a los elementos de cualquier contenedor, independientemente de cómo ese contenedor almacene sus datos internamente. Piense en un iterador como un puntero generalizado que sabe cómo moverse a través de un contenedor.

Cada contenedor de la STL proporciona los métodos begin() y end(). El iterador begin() apunta al primer elemento, mientras que end() apunta a una posición después del último elemento: un centinela que marca dónde detenerse:

#include <vector>
#include <iostream>

int main() {
    std::vector<int> nums = {10, 20, 30};
    
    for (std::vector<int>::iterator it = nums.begin(); it != nums.end(); ++it) {
        std::cout << *it << " ";  // Desreferenciar para obtener el valor
    }
    // Salida: 10 20 30
}

La palabra clave auto simplifica significativamente las declaraciones de iteradores:

for (auto it = nums.begin(); it != nums.end(); ++it) {
    *it *= 2;  // Modificar elementos a través del iterador
}
// nums es ahora {20, 40, 60}

Los iteradores se dividen en diferentes categorías según sus capacidades. Los iteradores de acceso aleatorio (como los de vector) admiten operaciones aritméticas como it + 3 o it1 - it2.

Los iteradores bidireccionales (de list, map) pueden moverse hacia adelante y hacia atrás con ++ y --. Los iteradores de avance solo pueden moverse en una dirección.

Para el recorrido inverso, utiliza rbegin() y rend():

for (auto rit = nums.rbegin(); rit != nums.rend(); ++rit) {
    std::cout << *rit << " ";  // Imprime en orden inverso
}
challenge icon

Desafío

Fácil

Vamos a construir un sistema de seguimiento de inventario que utiliza iteradores para recorrer y manipular colecciones de artículos. Practicarás el uso de diferentes tipos de iteradores para navegar a través de los datos de varias maneras.

Organizarás tu código en dos archivos:

  • Inventory.h: Define una clase Inventory que gestiona una colección de cantidades de artículos almacenadas en un std::vector<int>.

    Tu clase debe proporcionar estos métodos:

    • addItem(int quantity) — añade una cantidad de artículo al inventario
    • printForward() — utiliza iteradores con begin() y end() para imprimir todas las cantidades separadas por espacios, seguidas de una nueva línea
    • printReverse() — utiliza iteradores inversos con rbegin() y rend() para imprimir todas las cantidades en orden inverso, separadas por espacios, seguidas de una nueva línea
    • doubleAll() — utiliza iteradores para recorrer el vector y duplicar cada cantidad in situ
    • getTotal() — utiliza iteradores para calcular y devolver la suma de todas las cantidades

    Utiliza la palabra clave auto para las declaraciones de tus iteradores para mantener el código limpio.

  • main.cpp: Lee cuatro entradas enteras (cada una en una línea separada) que representan cantidades de artículos.

    Crea un Inventory y añade las cuatro cantidades. Luego, demuestra el uso de iteradores mediante:

    1. Imprimir Forward: seguido de la llamada a printForward()
    2. Imprimir Reverse: seguido de la llamada a printReverse()
    3. Imprimir Total: <sum> usando getTotal()
    4. Llamar a doubleAll() para modificar las cantidades
    5. Imprimir After doubling: seguido de la llamada a printForward()
    6. Imprimir New total: <sum> usando getTotal()

Por ejemplo, con las entradas 10, 25, 15, y 30:

Forward: 10 25 15 30 
Reverse: 30 15 25 10 
Total: 80
After doubling: 20 50 30 60 
New total: 160

Este desafío te permite practicar tanto la lectura de elementos a través de iteradores (para imprimir y sumar) como la modificación de elementos a través de iteradores (para duplicar). También verás cómo los iteradores inversos hacen que el recorrido hacia atrás sea sencillo sin ninguna manipulación de índices.

Pruébalo tú mismo

#include <iostream>
#include "Inventory.h"

using namespace std;

int main() {
    // Lee cuatro entradas de enteros
    int q1, q2, q3, q4;
    cin >> q1;
    cin >> q2;
    cin >> q3;
    cin >> q4;

    // TODO: Crea un objeto Inventory

    // TODO: Agrega las cuatro cantidades al inventario

    // TODO: Imprime "Forward: " y luego llama a printForward()

    // TODO: Imprime "Reverse: " y luego llama a printReverse()

    // TODO: Imprime "Total: " seguido del resultado de getTotal()

    // TODO: Llama a doubleAll() para modificar las cantidades

    // TODO: Imprime "After doubling: " y luego llama a printForward()

    // TODO: Imprime "New total: " seguido del resultado de getTotal()

    return 0;
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos