Menu
Coddy logo textTech

Patrón Iterator

Parte de la sección Programación Orientada a Objetos del Journey de C de Coddy. Lección 56 de 61.

El patrón Iterator proporciona una forma de acceder secuencialmente a los elementos de una colección sin exponer su estructura subyacente. En lugar de dar a los usuarios acceso directo a un array, les das un objeto que sabe cómo recorrer los datos un elemento a la vez.

Un iterador normalmente necesita dos datos: una referencia a la colección y la posición actual. En C, creamos una estructura para almacenar este estado:

typedef struct {
    int* data;      // puntero al array
    int size;       // número total de elementos
    int current;    // posición actual
} IntIterator;

El iterador expone dos funciones clave. has_next() comprueba si quedan más elementos por leer, y next() devuelve el elemento actual y avanza la posición:

int has_next(IntIterator* it) {
    return it->current < it->size;
}

int next(IntIterator* it) {
    return it->data[it->current++];
}

Usar el iterador se ve limpio y oculta los detalles del arreglo:

IntIterator it = create_iterator(numbers, 5);
while (has_next(&it)) {
    printf("%d\n", next(&it));
}

La persona que realiza la llamada nunca necesita saber que numbers es un arreglo ni cómo funciona la indexación. Esta abstracción facilita cambiar posteriormente la estructura de datos subyacente, de un arreglo a una lista enlazada, por ejemplo, sin cambiar el código que utiliza el iterador.

challenge icon

Desafío

Fácil

Construyamos un iterador NumberList: una abstracción limpia que te permite recorrer una colección de enteros sin exponer la estructura de la matriz subyacente.

Organizarás tu código en tres archivos:

  • iterator.h: Define una estructura IntIterator que contiene un puntero a una matriz de enteros, el tamaño total de la colección y la posición actual. Declara tres funciones: create_iterator (recibe un puntero a una matriz y su tamaño, y devuelve un iterador inicializado), has_next (comprueba si quedan más elementos) y next (devuelve el elemento actual y avanza la posición). ¡No olvides las guardas de inclusión!
  • iterator.c: Implementa las funciones del iterador. La función create_iterator debe devolver un IntIterator por valor, con la posición actual establecida en 0. La función has_next devuelve 1 si quedan más elementos por leer y 0 en caso contrario. La función next devuelve el elemento en la posición actual y después incrementa la posición.
  • main.c: Lee el número de elementos y después lee cada valor entero en una matriz. Crea un iterador para esta matriz y después usa un bucle while con has_next y next para recorrer e imprimir cada elemento en su propia línea.

Tu programa recibirá:

  1. El número de elementos de la matriz
  2. Cada valor entero en una línea separada

Usa el patrón iterador para imprimir todos los elementos: ¡no uses indexación directa de la matriz en tu bucle de recorrido!

Salida de ejemplo cuando las entradas son 4, después 10, 20, 30, 40:

10
20
30
40

Salida de ejemplo cuando las entradas son 3, después -5, 0, 100:

-5
0
100

Salida de ejemplo cuando las entradas son 1, después 42:

42

El iterador oculta cómo se almacenan los datos. Tu bucle principal simplemente pregunta «¿hay más?» y «dame el siguiente» sin saber nada sobre los índices de la matriz ni la disposición de la memoria.

Pruébalo tú mismo

#include <stdio.h>
#include "iterator.h"

int main() {
    int n;
    scanf("%d", &n);
    
    int arr[n];
    
    // TODO: Lee n valores enteros en el array
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }
    
    // TODO: Crea un iterador para el array
    
    // TODO: Usa un bucle while con has_next y next para recorrer
    // e imprime cada elemento en su propia línea
    // ¡NO uses la indexación directa del array en tu bucle de recorrido!
    
    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