Heim >Backend-Entwicklung >C++ >Wie kann ich meine benutzerdefinierten Typen mithilfe bereichsbasierter For-Schleifen in C iterierbar machen?
Verwenden von „bereichsbasierten for-Schleifen“ mit benutzerdefinierten Typen
Benutzerdefinierte Typintegration
Um „bereichsbasierte for-Schleifen“ für Ihren benutzerdefinierten Typ zu aktivieren, können Sie Folgendes implementieren Folgendes:
Namespace Überlegungen
Anforderungen an den Rückgabewert
Die von zurückgegebenen Objekte begin() und end() müssen keine tatsächlichen Iteratoren sein. Sie müssen die folgenden Anforderungen erfüllen:
Entkoppelte Typen
In C 17 die Typen von begin und end wurden entkoppelt. Dadurch kann der End-Iterator einen anderen Typ haben als der Anfang-Iterator. Dies ist nützlich für „Sentinel“-Iteratoren, die nur != mit dem Iteratortyp „begin“ unterstützen und so eine effiziente Iteration über nullterminierte Zeichenpuffer ermöglichen.
Beispiel für eine Bibliothekserweiterung
Stellen Sie sich einen Bibliothekstyp vor some_struct_you_do_not_control, das einen Vektor aus ganzen Zahlen enthält, aber keine Methoden begin() und end() hat.
namespace library_ns { struct some_struct_you_do_not_control { std::vector<int> data; }; }
Zu erstellen Da dieser Typ iterierbar ist, können Sie der library_ns die folgenden Funktionen hinzufügen Namespace:
namespace library_ns { int* begin(some_struct_you_do_not_control& x){ return x.data.data(); } int* end(some_struct_you_do_not_control& x){ return x.data.data()+x.data.size(); } int const* cbegin(some_struct_you_do_not_control const& x){ return x.data.data(); } int* cend(some_struct_you_do_not_control const& x){ return x.data.data()+x.data.size(); } int const* begin(some_struct_you_do_not_control const& x){ return cbegin(x); } int const* end(some_struct_you_do_not_control const& x){ return cend(x); } }
Jetzt können Sie mit bereichsbasierten for-Schleifen über den Vektor iterieren:
library_ns::some_struct_you_do_not_control s; for (int i : s) { // ... }
Beispiel für einen benutzerdefinierten Typ
Für einen benutzerdefinierten Typ, den Sie steuern, können Sie begin() und definieren end() Methoden direkt innerhalb des Typs:
struct egg_carton { std::vector<egg> eggs; auto begin() { return eggs.begin(); } auto end() { return eggs.end(); } // ... };
Das obige ist der detaillierte Inhalt vonWie kann ich meine benutzerdefinierten Typen mithilfe bereichsbasierter For-Schleifen in C iterierbar machen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!