Video: 03D.3 Primzahlen bis 100 zählen; verschachtelte Schleifen 2024
Der C ++ - Programmierer iteriert durch ein Array, indem er den Index jedes Elements bereitstellt. Diese Technik funktioniert jedoch nicht bei Containern wie list , die keinen direkten Zugriff zulassen. Man könnte sich eine Lösung vorstellen, die auf Methoden wie getFirst () und getNext () basiert; Die Entwickler der Standard Template Library wollten jedoch eine einheitliche Methode für das Überqueren jeder Art von Container bereitstellen.
Dazu definiert die Standard Template Library den Iterator.
Ein -Iterator ist ein Objekt, das auf die Mitglieder eines Containers verweist. Im Allgemeinen unterstützt jeder Iterator die folgenden Funktionen:
-
Eine Klasse kann einen Iterator zurückgeben, der auf das erste Mitglied der Sammlung zeigt.
-
Der Iterator kann von einem Member zum nächsten verschoben werden.
-
Der Iterator gibt eine Angabe zurück, wenn das Ende der Liste erreicht ist.
-
Das Programm kann das Element abrufen, auf das der Iterator zeigt.
Die Standardvorlagenbibliothek bietet auch umgekehrte Iteratoren für die Rückwärtsbewegung durch Listen. Alles hier über Iteratoren gilt gleichermaßen für umgekehrte Iteratoren.
Der Code, der notwendig ist, um durch eine Liste zu iterieren, unterscheidet sich von dem, der notwendig ist, um einen Vektor zu durchlaufen (um nur zwei Beispiele zu nennen). Der Iterator blendet diese Details jedoch aus.
Die Methode begin () gibt einen Iterator zurück, der auf das erste Element einer Liste zeigt. Der Indirektionsoperator * () ruft eine Referenz auf das Objekt ab, auf das der Iterator zeigt. Der Operator ++ verschiebt den Iterator zum nächsten Element in der Liste.
Ein Programm fährt fort, seinen Weg durch die Liste zu inkrementieren, bis der Iterator gleich dem von end () zurückgegebenen Wert ist. Das folgende Code-Snippet beginnt am Anfang einer Liste mit Schülern und zeigt jeden ihrer Namen an:
void displayStudents (list & students) {// Zuweisen eines Iterators, der auf das erste // -Element in der Listenliste verweist:: iterator iter = Schüler. Start(); // weiter die Liste durchlaufen, bis der // Iterator das Ende der Liste erreicht (iter! = students. end ()) {// den Student abrufen, den der Iterator auf Student & s = * iter zeigt; cout << s. sName << endl; // Verschiebe den Iterator nun zum nächsten Element // in der Liste iter ++;}}
Deklarationen für Iteratoren können sehr komplex werden. Dies ist wahrscheinlich die beste Begründung für die auto -Deklaration, die mit dem Standard '11 eingeführt wurde:
für (auto iter = studenten. Begin (); iter! = Studenten. End (); iter ++) {coutDies deklariert iter als Iterator beliebigen Typs, der von der Methodenliste zurückgegeben wird:: begin () , vermeidet die gequälten Deklarationen, die im früheren Code-Snippet angezeigt werden.Wie cool ist das!