Menu
CoddyTech

Padrão Iterator

Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 56 de 61.

O padrão Iterator oferece uma maneira de acessar os elementos de uma coleção sequencialmente sem expor sua estrutura subjacente. Em vez de dar aos usuários acesso direto a um array, você fornece a eles um objeto que sabe como percorrer os dados, um elemento por vez.

Um iterador geralmente precisa de duas informações: uma referência à coleção e a posição atual. Em C, criamos uma struct para armazenar esse estado:

typedef struct {
    int* data;      // ponteiro para o array
    int size;       // número total de elementos
    int current;    // posição atual
} IntIterator;

O iterador disponibiliza duas funções principais. has_next() verifica se há mais elementos para ler, e next() retorna o elemento atual e avança a posição:

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

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

Usar o iterador deixa o código mais limpo e oculta os detalhes do array:

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

Quem faz a chamada nunca precisa saber que numbers é um array nem como funciona a indexação. Essa abstração facilita a alteração posterior da estrutura de dados subjacente, de um array para uma lista encadeada, por exemplo, sem mudar o código que usa o iterador.

challenge icon

Desafio

Fácil

Vamos criar um iterador NumberList: uma abstração simples que permite percorrer uma coleção de números inteiros sem expor a estrutura do array subjacente.

Você organizará seu código em três arquivos:

  • iterator.h: Defina uma struct IntIterator que armazena um ponteiro para um array de números inteiros, o tamanho total da coleção e a posição atual. Declare três funções: create_iterator (recebe um ponteiro para um array e seu tamanho, e retorna um iterador inicializado), has_next (verifica se ainda há mais elementos) e next (retorna o elemento atual e avança a posição). Não se esqueça dos protetores de inclusão!
  • iterator.c: Implemente as funções do iterador. A função create_iterator deve retornar um IntIterator por valor, com a posição atual definida como 0. A função has_next retorna 1 se houver mais elementos para ler e 0 caso contrário. A função next retorna o elemento na posição atual e, em seguida, incrementa a posição.
  • main.c: Leia o número de elementos e, em seguida, leia cada valor inteiro em um array. Crie um iterador para esse array e, depois, use um loop while com has_next e next para percorrer e imprimir cada elemento em sua própria linha.

Seu programa receberá:

  1. O número de elementos no array
  2. Cada valor inteiro em uma linha separada

Use o padrão de iterador para imprimir todos os elementos: não use acesso direto ao array por índice no seu loop de percurso!

Exemplo de saída quando as entradas são 4, depois 10, 20, 30, 40:

10
20
30
40

Exemplo de saída quando as entradas são 3, depois -5, 0, 100:

-5
0
100

Exemplo de saída quando as entradas são 1, depois 42:

42

O iterador oculta como os dados são armazenados. Seu loop principal simplesmente pergunta "há mais?" e "me dê o próximo", sem saber nada sobre índices do array ou organização da memória.

Experimente você mesmo

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

int main() {
    int n;
    scanf("%d", &n);
    
    int arr[n];
    
    // TODO: Leia n valores inteiros para o array
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }
    
    // TODO: Crie um iterador para o array
    
    // TODO: Use um laço while com has_next e next para percorrer
    // e imprima cada elemento em sua própria linha
    // NÃO use indexação direta do array no seu laço de percurso!
    
    return 0;
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de C online