Vídeo: Programar em C - Manipulação de Arquivos txt em C / Ler Dados - Aula 82 2024
O programador C ++ itera através de uma matriz fornecendo o índice de cada elemento. No entanto, esta técnica não funciona para contêineres como list 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 Biblioteca de modelos padrão queriam fornecer um método comum para percorrer qualquer tipo de recipiente.
Para isso, a Biblioteca de modelos padrão define o iterador.
Um iterador é um objeto que aponta para os membros de um contêiner. Em geral, cada iterador suporta as seguintes funções:
-
Uma classe pode retornar um iterador que aponte para o primeiro membro da coleção.
-
O iterador pode ser movido de um membro para o próximo.
-
O iterador retorna uma indicação quando atinge o final da lista.
-
O programa pode recuperar o elemento apontado pelo iterador.
A Biblioteca de modelos padrão também fornece iteradores reversos para mover para trás as listas. Tudo aqui sobre iteradores aplica-se igualmente aos iteradores reversos.
O código necessário para iterar através de uma lista é diferente do necessário para percorrer um vetor (para citar apenas dois exemplos). No entanto, o iterador esconde esses detalhes.
O método começa () retorna um iterador que aponta para o primeiro elemento de uma lista. O operador indireto * () recupera uma referência ao objeto apontado pelo iterador. O ++ operador move o iterador para o próximo elemento na lista.
Um programa continua a incrementar seu caminho através da lista até que o iterador seja igual ao valor retornado pelo final () . O seguinte fragmento de código começa no início de uma lista de alunos e exibe cada um de seus nomes:
void displayStudents (lista e alunos) {// atribuir um iterador que aponte para o primeiro elemento // na lista de lista:: iterator iter = students. início(); // continua a percorrer a lista até o // iterador atingir o final da lista enquanto (iter! = students. end ()) {// recupera o Student o iterador aponta para Student & s = * iter; cout << s. sName << endl; // agora mova o iterador para o próximo elemento // na lista iter ++;}}
As declarações para iteradores podem ficar muito complexas. Esta é provavelmente a melhor justificativa para a declaração auto introduzida com o padrão '11:
para (auto iter = students. Begin (); iter! = Students. End (); iter ++) {coutIsso declara que Iter é um iterador de qualquer tipo que seja retornado pela lista de métodos:: begin () , evitando as declarações torturadas mostradas no fragmento de código anterior.Quão legal é isso!