Iterator anbieten
-
Hallo,
ich schreibe momentan an einer API und möchte gern einen Iterator nach außen anbieten ohne denn klasseninternen Vector public zu machen. Wie macht man sowas? Momentan biete ich ein getVektorBegin() und getVektorEnd() an?
Geht das auch schöner?
Vielen Dank für die Hilfe
-
typedef ... const_iterator; const_iterator begin() const; const_iterator end() const;
?
-
Geht das auch etwas genauer? Mit typedefs hab ich noch nicht oft gearbeitet.
-
typedef std::vector<X>::const_iterator const_iterator;
Und jetzt frag nicht, was
X
ist :p
-
Haha ne das bekomme ich noch hin
Danke
-
Aber sagen wir mal, ich habe
class Foo { private: vector<int> bars; }
Und ich möchte jetzt einen Iterator für diesen vector anbieten. Wo definiere ich denn, dass es der Iterator von bars ist?
-
HackerNeo schrieb:
Und ich möchte jetzt einen Iterator für diesen vector anbieten. Wo definiere ich denn, dass es der Iterator von bars ist?
Da wo du den Iterator rausgibst, gibst du einen Iterator von bars raus. Also zum Beispiel:
class Foo { private: vector<int> bars; public: vector<int>::iterator begin() { return bars.begin(); } };
-
Foo::const_iterator Foo::begin() const { return bars.cbegin(); } Foo::const_iterator Foo::end() const { return bars.cend(); }
-
Nathan: Wirklich nötig, ihn jetzt noch mit
cbegin
zu verwirren
-
Was denn?
Ich hielt mich nur an:GetAnswerBegin() schrieb:
typedef ... const_iterator; const_iterator begin() const; const_iterator end() const;
?
-
Haha das hab ich wohl verstanden
-
Nathan schrieb:
Was denn?
Hier ist doch für den Compiler aus dem const-Kontext her klar, dass die const-Version von begin und end gemeint ist.
Foo::const_iterator Foo::begin() const { return bars.begin(); }
Identisch zu deinem Vorschlag.
Das cbegin/cend brauchst du vor allem im Zusammenhang mit type inference.
-
Ich nutze immer die c-Version, wenn ich einen const will.
Finde ich ist übersichtlicher, falls sich doch mal der Kontext ändert.