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

O C ++ itera programador através de uma matriz, fornecendo 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-se imaginar uma solução baseada em métodos 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 objectivo que aponta para os membros de um contentor. 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.

  • O iterador pode ser movido de um membro para o outro.

  • 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-se para trás através de listas. Tudo aqui sobre iterators 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, a iteração esconde esses detalhes.

O método início() devolve uma iteração 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 elemento seguinte na lista.

Um programa continua a incrementar o seu caminho através da lista até que a iteração é igual ao valor devolvido pela 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 estudantes) {// alocar um iterador que aponta para o primeiro elemento // no listlist:: Iter iterator = students.begin () - (! Iter = students.end ()) // continuar para 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 ++ -}}

As declarações de 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-> 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. Como isso é legal!

menu