Iterationsvereinfachung mit benutzerdefinierten Typen
In C 11 hat die Einführung bereichsbasierter for-Schleifen den Prozess der Iteration über Sequenzen vereinfacht. Diese Schleifen folgen einem standardisierten Muster:
for (Type& v : a) { ... } // equivalent to traditional loop below
for (auto iv = begin(a); iv != end(a); ++iv) {
Type& v = *iv;
...
}
Nach dem Login kopieren
Sie können diese Funktionalität auf Ihre benutzerdefinierten Typen erweitern, sodass sie in bereichsbasierten Schleifen verwendet werden können, indem Sie diese Richtlinien befolgen:
Ansatz 1 : Member-Funktionsdeklaration
- Definieren Sie begin()- und end()-Memberfunktionen in Ihrem Typ X, die Objekte iteratorartig zurückgeben Verhalten.
Ansatz 2: Freier Funktionsaufruf
- Erstellen Sie freie Funktionen begin(X&) und end(X&) im selben Namespace wie Ihr Typ X und geben Sie erneut einen Iterator zurück -ähnliche Objekte.
Diese Funktionen stellen die notwendigen Initialisierungs- (begin()) und Endpunkte (end()) für die bereit Bereichsbasierte Schleife.
Anforderungen an Funktionsrückgabewerte
Die von begin() und end() zurückgegebenen Objekte müssen keine tatsächlichen Iteratoren sein. Sie müssen jedoch die folgenden Anforderungen erfüllen:
- Vorab überladen, um das Objekt zu erhöhen
- Gültige Initialisierungsausdrücke sicherstellen
- Binär != für booleschen Kontext unterstützen
- Implementieren Sie unary *, um einen Wert zurückzugeben, der der Schleifenvariablen zuweisbar ist
- Stellen Sie einen öffentlichen Wert bereit Destruktor
Zusätzliche Überlegungen
- Wenn Ihr benutzerdefinierter Typ zum XML-Namespace gehört, definieren Sie xml::begin(), um mögliche Konflikte mit std::begin() zu vermeiden.
- Zukünftige C-Revisionen können die Typen von begin() und end() entkoppeln, was ein „Lazy-End“ ermöglicht. Auswertung.
- C 17 führte einen neuen Typ ein, null_sentinal_t, der bereichsbasierte Schleifen über nullterminierte Zeichenpuffer ermöglicht.
- Die bereichsbasierte Schleife verwendet temporäre Variablen, die in Auto&&-Referenzen gespeichert sind bedeutet, dass Ihre begin()- und end()-Überladungen nicht erkennen können, ob sie auf temporären Programmen ausgeführt werden.
Das obige ist der detaillierte Inhalt vonWie kann ich meine benutzerdefinierten C-Typen mithilfe bereichsbasierter For-Schleifen iterierbar machen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!