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