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 (listaestudantes) {// 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