Sobes.tech
Junior

O que é um iterador na biblioteca padrão de modelos (STL)?

sobes.tech IA

Resposta da IA

O iterador na STL é um conceito generalizado que fornece uma forma de aceder aos elementos de um contêiner (por exemplo, vector, list, map) de forma sequencial, sem revelar a estrutura interna desse contêiner. É semelhante a um ponteiro para um elemento, mas com capacidades adicionais dependendo da categoria do iterador.

Funções principais do iterador:

  • Aceder ao elemento atual (*it).
  • Mover-se para o próximo elemento (++it).
  • Comparar com outro iterador (por exemplo, para determinar o fim da sequência it != end()).

Categorias de iteradores (por ordem de expansão de capacidades):

  1. Input Iterator: Pode ler elementos uma única vez (por exemplo, entrada de um fluxo). Suporta *it (para leitura), ++it, it == outro.
  2. Output Iterator: Pode escrever elementos uma única vez (por exemplo, saída para um fluxo). Suporta *it (para escrita), ++it.
  3. Forward Iterator: Pode ler e escrever elementos múltiplas vezes e só pode avançar para frente. Suporta *it (leitura/escrita), ++it, it == outro.
  4. Bidirectional Iterator: Pode mover-se para frente e para trás. Suporta todas as operações do Forward Iterator, além de --it.
  5. Random Access Iterator: Pode mover-se por um número arbitrário de elementos em um único passo (como ponteiros). Suporta todas as operações do Bidirectional Iterator, além de:
    • it + n, it - n (deslocamento por n elementos)
    • it += n, it -= n
    • it[n] (acesso ao elemento com deslocamento n)
    • it < outro, <=, >, >= (comparação de posições)

Exemplo de uso:

#include <vector>
#include <iostream>

int main() {
    std::vector<int> v = {1, 2, 3, 4, 5};

    // Obter um iterador para o início do contêiner
    std::vector<int>::iterator it = v.begin();

    // Percorrer os elementos usando o iterador
    while (it != v.end()) {
        std::cout << *it << " "; // Desreferenciar o iterador para aceder ao valor
        ++it; // Avançar para o próximo elemento
    }
    std::cout << std::endl; // Saída: 1 2 3 4 5

    return 0;
}

Os iteradores fornecem uma abstração sobre o tipo específico do contêiner, permitindo que os algoritmos STL funcionem de forma uniforme com diferentes tipos de dados.