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.

Hoja de referencia

Los iteradores son objetos que proporcionan una forma uniforme de acceder a los elementos en los contenedores. Actúan como punteros generalizados que saben cómo desplazarse 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:

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
}

Utilice la palabra clave auto para simplificar las declaraciones de los iteradores:

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

Categorías de iteradores basadas en sus capacidades:

  • Iteradores de acceso aleatorio (por ejemplo, vector) admiten operaciones aritméticas como it + 3 o it1 - it2
  • Iteradores bidireccionales (por ejemplo, list, map) pueden moverse hacia adelante y hacia atrás con ++ y --
  • Iteradores hacia adelante solo pueden moverse en una dirección

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

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

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