Video: Writing 2D Games in C using SDL by Thomas Lively 2025
C ++-programmereren gentager sig gennem et array ved at give indekset for hvert element. Denne teknik virker imidlertid ikke for containere som liste , der ikke tillader tilfældig adgang. Man kunne forestille sig en løsning baseret på metoder som getFirst () og getNext () ; Designerne af Standard Template Library ønskede imidlertid at levere en fælles metode til at krydse enhver form for beholder.
Til dette definerer standardskabelonbiblioteket iteratoren.
En iterator er et objekt, der peger på medlemmerne af en beholder. Generelt understøtter hver iterator følgende funktioner:
-
En klasse kan returnere en iterator, der peger på det første medlem af samlingen.
-
Iteratoren kan flyttes fra et medlem til det næste.
-
Iteratoren returnerer en indikation, når den når slutningen af listen.
-
Programmet kan hente elementet påpeget af iteratoren.
Standardskabelonbiblioteket giver også omvendte iteratorer til at bevæge sig baglæns gennem lister. Alt her om iteratorer gælder lige for omvendte iteratorer.
Koden, der er nødvendig for at gentage gennem en liste , er forskellig fra den, der er nødvendig for at krydse en vektor (for blot at nævne to eksempler). Imidlertid skjuler iteratoren disse detaljer.
Metoden begynder () returnerer en iterator, der peger på det første element i en liste. Indirection operatoren * () henter en henvisning til objektet påpeget af iteratoren. Operatøren ++ flytter iteratoren til det næste element i listen.
Et program fortsætter med at øge sin vej gennem listen, indtil iteratoren er lig med den værdi, der returneres af slutningen () . Følgende kodestykke starter i starten af en liste over studerende og viser hver af deres navne:
void displayStudents (liste og studerende) {// allokere en iterator, der peger på det første // element i listen listen:: iterator iter = studerende. begynde(); // fortsæt med at springe igennem listen, indtil // iteratoren rammer slutningen af listen, mens (iter! = students. end ()) {// henter Student iteratoren peger på Student & s = * iter; cout << s. sName << endl; // nu flytte iteratoren over til det næste element // i listen iter ++;}}
Erklæringer til iteratorer kan blive meget komplekse. Dette er nok den bedste begrundelse for auto erklæringen introduceret med '11 standard:
til (auto iter = studerende. Start (); iter! = Studerende. Ende (); iter ++)Dette erklærer iter at være en iterator af hvilken type som helst, returneres af metodelisten:: start () , undgå de torturerede erklæringer vist i den tidligere kodestykke.Hvor sej er det!