Video: Writing 2D Games in C using SDL by Thomas Lively 2024
De C ++ -programmeur itereert door een array door de index van elk element te leveren. Deze techniek werkt echter niet voor containers zoals lijst die geen willekeurige toegang toestaan. Je zou je een oplossing kunnen voorstellen die is gebaseerd op methoden als getFirst () en getNext () ; de ontwerpers van de standaard sjabloonbibliotheek wilden echter een veelgebruikte methode bieden voor het doorlopen van elk type container.
Hiervoor definieert de standaard sjabloonbibliotheek de iterator.
Een iterator is een object dat verwijst naar de leden van een container. Over het algemeen ondersteunt elke iterator de volgende functies:
-
Een klasse kan een iterator retourneren die verwijst naar het eerste lid van de verzameling.
-
De iterator kan van het ene lid naar het andere worden verplaatst.
-
De iterator retourneert een aanwijzing wanneer deze het einde van de lijst bereikt.
-
Het programma kan het element ophalen waarnaar wordt verwezen door de iterator.
De standaard sjablonenbibliotheek biedt ook reverse iterators om door lijsten heen te bladeren. Alles hier over iterators geldt evengoed voor reverse iterators.
De code die nodig is om een -lijst te doorlopen, wijkt af van de code die nodig is om een -vector te doorlopen (om slechts twee voorbeelden te noemen). De iterator verbergt deze details echter.
De methode begin () geeft een iterator die verwijst naar het eerste element van een lijst. De indirecte operator * () haalt een verwijzing op naar het object waarnaar wordt verwezen door de iterator. De operator ++ verplaatst de iterator naar het volgende element in de lijst.
Een programma blijft door de lijst lopen totdat de iterator gelijk is aan de waarde geretourneerd door end () . Het volgende codefragment begint aan het begin van een lijst met studenten en geeft elk van hun namen weer:
void displayStudents (lijst & studenten) {// een iterator toewijzen die verwijst naar het eerste // -element in de lijst:: iterator iter = studenten. beginnen(); // blijf door de lijst bladeren tot de // iterator het einde van de lijst raakt (iter! = students. end ()) {// haal de student de iteratorpunten op Student & s = * iter; cout << s. sName << endl; // verplaats de iterator nu naar het volgende element // in de lijst iter ++;}}
Verklaringen voor iterators kunnen erg complex worden. Dit is waarschijnlijk de beste rechtvaardiging voor de auto -verklaring geïntroduceerd met de '11-standaard:
voor (auto iter = students. Begin (); iter! = Students. End (); iter ++) {coutHiermee wordt aangegeven dat iterator een iterator is van het type dat wordt geretourneerd door de lijst met methoden:: begin () , vermijd de gemartelde verklaringen die worden weergegeven in het eerdere codefragment.Hoe cool is dat!