Video: Writing 2D Games in C using SDL by Thomas Lively 2024
C ++-programmeraren iterates genom en array genom att ge indexet för varje element. Denna teknik fungerar emellertid inte för behållare som lista som inte tillåter slumpmässig åtkomst. Man kan föreställa sig en lösning baserad på metoder som getFirst () och getNext () ; Designarna i Standard Template Library ville emellertid ge en gemensam metod för att korsa alla typer av behållare.
Därför definierar standardmallbiblioteket iteratorn.
En iterator är ett objekt som pekar mot medlemmarna av en behållare. I allmänhet stöder varje iterator följande funktioner:
-
En klass kan returnera en iterator som pekar på den första medlemmen i samlingen.
-
Iteratorn kan flyttas från en medlem till en annan.
-
Iteratorn returnerar en indikation när den når slutet av listan.
-
Programmet kan hämta elementet pekat på av iteratorn.
Standardmallabiblioteket ger också omvänd iteratorer för att flytta bakåt genom listor. Allt här om iteratorer gäller lika för omvänd iteratorer.
Koden som behövs för iterering via en lista skiljer sig från det som behövs för att korsa en vektor (för att bara nämna två exempel). Men iteratorn döljer dessa detaljer.
Metoden börjar () returnerar en iterator som pekar på det första elementet i en lista. Indirection operatören * () hämtar en referens till det objekt som pekas på av iteratorn. Operatorn ++ flyttar iteratorn till nästa element i listan.
Ett program fortsätter att öka sin väg genom listan tills iteratorn är lika med värdet som returneras av slutet () . Följande kodstämpel börjar i början av en lista med studenter och visar var och en av deras namn:
void displayStudents (lista och studenter) {// allokera en iterator som pekar på det första // elementet i lististan:: iterator iter = studenter. Börja(); // fortsätt att springa igenom listan tills // iteratorn träffar slutet av listan medan (iter! = students. end ()) {// hämta Student iteratorn pekar på Student & s = * iter; cout << s. sName << endl; // flytta nu isäratorn till nästa element // i listan iter ++;}}
Förklaringar för iteratorer kan bli mycket komplexa. Detta är förmodligen den bästa motiveringen för auto -deklarationen som introducerades med '11-standarden:
för (auto iter = studenter. Begin (); iter! = Studenter. Slut (); iter ++) {coutDetta förklarar att det är en iterator av vilken typ som helst som returneras av metodlistan:: begin () , undviker de torterade deklarationerna som visas i det tidigare kodbiten.Hur coolt är inte det!