Programação c ++: fazer o seu caminho através de uma lista

O C ++ itera programador através de uma matriz, proporcionando o índice de cada elemento. No entanto, esta técnica não funciona para recipientes como Lista que não permitem acesso aleatório. Pode imaginar-se uma solução com base em métodos tais como GetFirst () e getNext ()- no entanto, os designers da Standard Template Library quis fornecer um método comum para atravessar qualquer tipo de recipiente.

Para isso, a Standard Template Library define o iterator.

A iterator É um objecto que aponta para os membros de um recipiente. Em geral, cada iteração suporta as seguintes funções:

  • Uma classe pode retornar um iterador que aponta para o primeiro membro da coleção.

  • A iteração pode ser movido a partir de um membro para a próxima.

  • A iteração devolve uma indicação de quando se atinge o fim da lista.

  • O programa pode recuperar o elemento apontado pelo iterador.

O Standard Template Library também fornece iteradores reversos para mover para trás através de listas. Tudo aqui sobre iteradores se aplica igualmente para iteradores reversos.



O código necessário para percorrer uma Lista é diferente do que necessário para percorrer uma vetor (para citar apenas dois exemplos). No entanto, o iterador esconde esses detalhes.

O método início() retorna um iterador que aponta para o primeiro elemento de uma lista. o engano operador*() recupera uma referência para o objecto apontada pelo iteração. o ++ operador move o iterador para o próximo elemento da lista.

Um programa continua a incrementar o seu caminho através da lista até que o iterador é igual ao valor retornado pelo fim(). O seguinte trecho de código começa no início de uma lista de alunos e exibe cada um dos seus nomes:

displayStudents void (lista& alunos) {// alocar um iterador que aponta para o primeiro elemento // no listlist:: iter iterator = students.begin () - (! Iter = students.end ()) // continuar a percorrer a lista até o // iterador atinge o final do listwhile {// recuperar o Student os pontos iteradoras atStudent& s = * iter-cout lt; lt; S.sname lt; lt; endl - // agora mover o iterador para o próximo elemento // no listiter ++ -}}

Declarações para iterators pode ficar muito complexa. Esta é provavelmente a melhor justificativa para o auto declaração introduzido com o padrão `11:

para (auto iter = students.begin () - iter = students.end (!) - iter ++) {cout lt; lt; iter-gt; sName lt; lt; endl-}

Isto declara iter para ser um iterador de qualquer tipo é devolvido pelo método Lista::início(), evitando as declarações torturados mostrado no trecho de código anterior. Quão legal é isso!


Publicações relacionadas