Video: Calcolatrice in JavaScript - Javascript Tutorial #08 2024
Il programmatore C ++ itera attraverso un array fornendo l'indice di ciascun elemento. Tuttavia, questa tecnica non funziona per contenitori come elenco che non consentono l'accesso casuale. Si potrebbe immaginare una soluzione basata su metodi come getFirst () e getNext () ; tuttavia, i progettisti della Standard Template Library volevano fornire un metodo comune per attraversare qualsiasi tipo di contenitore.
Per questo, la libreria di modelli standard definisce l'iteratore.
Un iteratore è un oggetto che punta ai membri di un contenitore. In generale, ogni iteratore supporta le seguenti funzioni:
-
Una classe può restituire un iteratore che punta al primo membro della raccolta.
-
L'iteratore può essere spostato da un membro a quello successivo.
-
L'iteratore restituisce un'indicazione quando raggiunge la fine dell'elenco.
-
Il programma può recuperare l'elemento puntato dall'iteratore.
La libreria di modelli standard fornisce anche iteratori inversi per lo spostamento di elenchi a ritroso. Tutto qui sugli iteratori si applica allo stesso modo per gli iteratori inversi.
Il codice necessario per scorrere un elenco è diverso da quello necessario per attraversare un vettore (per citare solo due esempi). Tuttavia, l'iteratore nasconde questi dettagli.
Il metodo begin () restituisce un iteratore che punta al primo elemento di una lista. L'operatore di riferimento indiretto * () recupera un riferimento all'oggetto puntato dall'iteratore. L'operatore ++ sposta l'iteratore sull'elemento successivo nell'elenco.
Un programma continua ad incrementare il suo percorso attraverso l'elenco fino a quando l'iteratore è uguale al valore restituito da end () . Il seguente frammento di codice inizia all'inizio di un elenco di studenti e visualizza ciascuno dei loro nomi:
void displayStudents (elenco e studenti) {// allocare un iteratore che punta al primo // elemento nell'elenco lista:: iterator iter = studenti. inizio(); // continua a scorrere l'elenco finché // // iteratore raggiunge la fine dell'elenco mentre (iter! = studenti. end ()) {// recupera lo Studente i punti iteratore su Student & s = * iter; cout << s. sName << endl; // ora sposta l'iteratore sull'elemento successivo // nell'elenco iter ++;}}
Le dichiarazioni per gli iteratori possono diventare molto complesse. Questa è probabilmente la migliore giustificazione per la dichiarazione auto introdotta con lo standard '11:
per (auto iter = studenti. Begin (); iter! = Studenti. End (); iter ++) {coutCiò dichiara che iteratore è un iteratore di qualunque tipo viene restituito dall'elenco dei metodi:: begin () , evitando le dichiarazioni torturate mostrate nello snippet di codice precedente.Quant'è fico!