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 en cualquier contenedor, independientemente de cómo almacene internamente sus datos ese contenedor. Piensa en un iterador como un puntero generalizado que sabe cómo moverse por un contenedor.

Todo 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 considerablemente las declaraciones de iteradores:

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

Los iteradores se clasifican 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 y map) pueden avanzar y retroceder con ++ y --. Los iteradores hacia adelante solo pueden avanzar en una dirección.

Para el recorrido inverso, usa 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

Construyamos un sistema de seguimiento de inventario que use iteradores para recorrer y manipular colecciones de artículos. Practicarás el uso de distintos tipos de iteradores para navegar por los datos de varias maneras.

Organizarás tu código en dos archivos:

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

    Tu clase debe proporcionar estos métodos:

    • addItem(int quantity): agrega una cantidad de artículos al inventario
    • printForward(): usa iteradores con begin() y end() para imprimir todas las cantidades separadas por espacios, seguidas de una nueva línea
    • printReverse(): usa iteradores inversos con rbegin() y rend() para imprimir todas las cantidades en orden inverso, separadas por espacios, seguidas de una nueva línea
    • doubleAll(): usa iteradores para recorrer el vector y duplicar cada cantidad en su lugar
    • getTotal(): usa iteradores para calcular y devolver la suma de todas las cantidades

    Usa la palabra clave auto para las declaraciones de tus iteradores, a fin de mantener el código limpio.

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

    Crea un Inventory y agrega las cuatro cantidades. Después, demuestra el uso de iteradores mediante lo siguiente:

    1. Imprimir Forward: y después llamar a printForward()
    2. Imprimir Reverse: y después llamar a printReverse()
    3. Imprimir Total: <sum> usando getTotal()
    4. Llamar a doubleAll() para modificar las cantidades
    5. Imprimir After doubling: y después llamar 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 mediante iteradores (para imprimir y sumar) como la modificación de elementos mediante iteradores (para duplicar). También verás cómo los iteradores inversos hacen que recorrer hacia atrás sea sencillo, sin manipular ningún índice.

Pruébalo tú mismo

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

using namespace std;

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

    // TODO: Crea un objeto Inventory

    // TODO: Añade las cuatro cantidades al inventario

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

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

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

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

    // TODO: Print "After doubling: " then call 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

Practica por tu cuenta: Compilador de C++ online