Heim >Backend-Entwicklung >C++ >Wie kann ich meine benutzerdefinierten Typen mithilfe bereichsbasierter For-Schleifen in C iterierbar machen?

Wie kann ich meine benutzerdefinierten Typen mithilfe bereichsbasierter For-Schleifen in C iterierbar machen?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-28 22:06:15561Durchsuche

How Can I Make My Custom Types Iterable Using Range-Based For Loops in C  ?

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:

  • Mitgliedsfunktionen: Definieren Sie begin() und end() Mitgliedsfunktionen, die Objekte zurückgeben, die wie Iteratoren fungieren.
  • Kostenlose Funktionen: Erstellen Sie kostenlose Funktionen begin(Type&) und end(Type&) mit demselben Namespace wie Ihr benutzerdefinierter Typ und geben Objekte zurück, die sich wie Iteratoren verhalten.

Namespace Überlegungen

  • Wenn Ihr benutzerdefinierter Typ zu den gehört xml Namespace, definieren Sie xml::begin() oder xml::end(), um die korrekte Namespace-Zuordnung sicherzustellen.

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:

  • Implementieren Sie vor , um gültige Initialisierungsausdrücke sicherzustellen.
  • Implementieren Sie die Binärdatei != für den booleschen Vergleich .
  • Implementieren Sie unary *, um einen Wert für bereitzustellen Zuweisen zur Schleifenvariablen.
  • Einen öffentlichen Destruktor verfügbar machen.

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&amp; x){ return x.data.data(); }
  int* end(some_struct_you_do_not_control&amp; x){ return x.data.data()+x.data.size(); }
  int const* cbegin(some_struct_you_do_not_control const&amp; x){ return x.data.data(); }
  int* cend(some_struct_you_do_not_control const&amp; x){ return x.data.data()+x.data.size(); }
  int const* begin(some_struct_you_do_not_control const&amp; x){ return cbegin(x); }
  int const* end(some_struct_you_do_not_control const&amp; 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn