STL - Iteratoren
-
Hallo, ich versuch mich gerade ein wenig in die Thematik der STL einzuarbeiten und verstehe dabei folgende Syntax nicht:
vector<int>::iterator iter = ...;Wie darf ich das verstehen? Ist iterator eine eigene Klasse/Struktur innerhalb des vectors selbst? Wenn ja instanziere ich mit obigem Code nur ein Objekt der Klasse/Struktur iterator?
-
AxtImWalde schrieb:
Wie darf ich das verstehen? Ist iterator eine eigene Klasse/Struktur innerhalb des vectors selbst? Wenn ja instanziere ich mit obigem Code nur ein Objekt der Klasse/Struktur iterator?
Ja, eigentlich müsste die Definition daher
typename vector<int>::iterator iter = ...;lauten, damit klar ist, dass iterator keine öffenliche statische Membervariable, sondern ein Typ ist.
-
iter ist in dem Fall ein Iterator auf einen std::vector aus ints, d.h.
so eine Art Pointer auf den Vector. Damit ist es möglich, durch einen Vector wie durch ein normales Array durchzuiterieren, also kann man z.B. mit iter++ das nächste Element im Vector ansprechen.Und ja, so viel ich weiss ist in deinem Fall iter ein Objekt der Klasse std::vector<int>::iterator
der von mir oben verwendete operator ++ ist für diese Klasse überladen.
-
das typename muss doch weggelassen werden. es ist nur für templates nötig:
template<typename T> void foo() { typename T::iterator iter = ...; }
-
AxtImWalde schrieb:
Hallo, ich versuch mich gerade ein wenig in die Thematik der STL einzuarbeiten und verstehe dabei folgende Syntax nicht:
vector<int>::iterator iter = ...;Wie darf ich das verstehen? Ist iterator eine eigene Klasse/Struktur innerhalb des vectors selbst?
Das oder ein typedef-Alias auf einen Typ, der möglicherweise woanders definiert ist (im Falle von vector<int> könnte es sich auch um ein typedef auf int* handeln). In jedem Falle ist es ein Typbezeichner.
AxtImWalde schrieb:
Wenn ja instanziere ich mit obigem Code nur ein Objekt der Klasse/Struktur iterator?
Richtig, das ist eine ganz normale Variablendefinition.
-
AxtImWalde schrieb:
Wie darf ich das verstehen? Ist iterator eine eigene Klasse/Struktur innerhalb des vectors selbst? Wenn ja instanziere ich mit obigem Code nur ein Objekt der Klasse/Struktur iterator?
Einerseits gibt es in C++ die Möglichkeit, innerhalb von Klassen Unterklassen zu definieren, zum anderen gibts die Möglicheit, typedefs auf andere Klassen innerhalb von Klassen zu definieren. Beispiel:
class SomeOtherClass {/*...*/}; class Outer { public: class Inner { /*...*/ }; typedef SomeOtherClass Other; /*...*/ }; Outer::Inner i; //Objekt vom Typ Inner Outer::Other o; //Objekt vom Typ SomeOtherClassIch bin nicht ganz sicher obs im Standard vorgeschrieben ist, aber die Iteratoren der Standardbibliothek sind meiner Erfahrung nach immer externe Klassen die über einen typedef in den Containern deklariert werden.
-
Ich bin nicht ganz sicher obs im Standard vorgeschrieben ist, aber die Iteratoren der Standardbibliothek sind meiner Erfahrung nach immer externe Klassen die über einen typedef in den Containern deklariert werden.
Genau das hatte mich auch verwirrt. In dem Tutorial, das ich gelesen habe, waren Iteratoren einmal völlig unabhängig von den Containern benutzt und erklärt worden (als unabhängige Klassen) und einmal in obigem Kontext ohne Hinweis darauf, wieso ich jetzt über den Container auch nen Iterator deklarieren kann.
Noch ne Frage hierzu: Wenn Iteratoren externe Klassen darstellen, inwiefern können Iteratoren dann überhaupt auf Containern operieren? Als externe Klasse wüsste der Iterator doch garnicht, wie der interne Aufbau des Containers aussieht. Ich dachte nur die Schnittstelle, die die Iteratoren nach "außen" (also den Algorithmen) zur Verfügung stellen, sei immer die gleiche, der interne Aufbau jedoch von Container zu Container unterschiedlich?!
-
das typedef für
Container::iteratorist implementation-defined.
das bedeutet, dass die klasse/strukturContainer::iteratorsehr wohl auch eine nested class sein. der iterator muss natürlich "wissen", wie der container intern aufgebaut ist. bei vector<X> kann der iterator auch einfach als X* definiert sein, muss aber nicht.
das einzige was feststeht ist, dassstd::iterator_traitsfür den jeweiligen iterator spezialisiert sein muss (d.h. idR wird der iterator vonstd::iteratorabgeleitet sein), und dasContainer::reverse_iterator, sofern es einen gibt, immer ein typedef aufstd::reverse_iterator<Container::iterator>ist.