Einsatz von Iteratoren

Content

Wenn eine neue Datenstruktur mit Inhalten aus einer anderen Datenstruktur zu füllen ist, dann ist es gut, wenn wir ebenfalls auf den Einsatz des default constructor verzichten können. Stattdessen sollte sogleich der Kopierkonstruktor zum Zuge kommen. Naheliegend ist es hier, einen Konstruktor anzubieten, der ein Paar von Iteratoren akzeptiert.

So könnte eine Verwendung aussehen:

#include "array.hpp"
int main() {
   int values[] = {2, 3, 5, 7, 11, 13};
   std::size_t dim = sizeof(values)/sizeof(values[0]);
   Array<int> a(values, values + dim);
}

Da wir beim Array die Dimensionierung sogleich festlegen müssen, geht dies nur, wenn die Iteratoren den Bedingungen eines random access iterator genügen, d.h. mit der Differenz zweier Zeiger könnten wir sogleich die Zahl der Elemente bestimmen.

Alternativ könnte auch die generische Funktion std::distance(it1, it2) aus #include <iterator> verwendet werden, die bei random access iterators konstanten Aufwand hat, im allgemeineren Fall von Forward-Iteratoren einen linearen Aufwand benötigt.

Ebenfalls wäre es reizvoll, wenn die Elemente eines Arrays mit Iteratoren durchlaufen werden könnten. Hierzu werden die Methoden begin und end benötigt. In Fällen wie diesen wäre es sogar besonders einfach, da reguläre Zeiger verwendet werden können und somit der Aufwand entfällt, eine spezielle Iterator-Klasse zu entwickeln. Wie bei den Zugriffsoperatoren ist dann aber sowohl der Fall mit und ohne Schreibschutz zu berücksichtigen.

Aufgaben und Fragen