iterator auf string vector, typ der von distance zurückgegeben wird
-
Wenn ich einen "iterator iter" auf einen "vector<string> X" habe, und ich die Funktion distance einsetze um rauszufinden wieviele Elemente dieser hat, muss ich dann distance(iter.begin(), iter.end()) oder distance(iter.begin(), iter.end()-1) machen?
Und was für einen Typ gibt distance zurück? (vector<string>::size_type ???)MfG
Stromberg
-
Hi,
das sind Sachen die man selbst schnell ausprobieren bzw. nachschlagen kann, dabei würdest auch selbst mehr lernen.distance(start,end) ist genauso intuitv zu bedienen wie alle anderen STL-Algorithmen. Es gibt dir die Anzahl der Elemente zwischen start und end zurück.
Der Rückgabetyp ist iterator::difference_typ vom übergebenen iterator.http://www.cplusplus.com/reference/std/iterator/distance.html
-
Und wie schreib ich dass dann als Code, denn dass hier funzt bei mir nicht:
iterator::difference_type position = .....;MfG
Stromberg
-
KasF schrieb:
Der Rückgabetyp ist iterator::difference_typ vom übergebenen iterator.
vector<string>::iterator::difference_type
-
@KasF,
Wäre nicht folgender Code sinnvoller?std::iterator_traits<std::vector<string>::iterator>::difference_type diff1; // bzw. std::vector<string>::difference_type diff2; // Sofern man gleich den Vektor als Typ vorliegen hat.Grüssli
-
Dravere schrieb:
@KasF,
Wäre nicht folgender Code sinnvoller?(1) std::iterator_traits<std::vector<string>::iterator>::difference_type diff1; (2) std::vector<string>::difference_type diff2;Grüssli
(1) wird doch auch nur zu vector<string>::iterator::difference_type [24.3.1.2], also kann man sich hier auch die traits sparen. Würde ja nur Sinn machen, wenn man den Typ des Iterators nicht kennen würde bzw. bestimmen müsste.
(2) ist identisch zu vector<string>::iterator::difference_type [23.1.5], insofern hast du recht und es ist sinnvoller direkt vector<string>::difference_type zu schreiben

-
@KasF: Beachte, dass ein Iterator auch ein purer Zeiger sein kann. So wird es wohl bei optimierten std::vector Iteratoren sein. Bei einem Zeiger-Iterator kannst du difference_type nur über die traits bekommen. Dafür sind die ja da.
Gruß
Don06
-
Don06 schrieb:
Bei einem Zeiger-Iterator kannst du difference_type nur über die traits bekommen.
oO
std::vector<T> test; /*lustige dinge mit test machen*/ std::vector<T>::difference_type t = std::distance(test.begin(), test.end()); std::cout << t << std::endl; //t für size ;Dich brauch hier keine traits und bin mir auch ziemlich sicher, dass folgender code standard-konform ist ^^
oder hab ich dich falsch verstanden?bb
-
Was nicht immer geht ist:
typedef std::vector<T>::iterator iterator_t; iterator_t::difference_type d; // Das geht nur, falls iterator_t eine Klasse ist.KasF hatte das vorgeschlagen.
KasF schrieb:
KasF schrieb:
Der Rückgabetyp ist iterator::difference_typ vom übergebenen iterator.
vector<string>::iterator::difference_type
-
Sind die Iteratoren bereits im C++-Code zu Zeigern optimiert? Das würde mich verwundern. Iteratoren müssen ja auch ein gemeinsames Interface bereitstellen, und das ist ja nicht nur auf die Zeigerarithmetik-Operatoren beschränkt...?
Und was ist denn eigentlich mit dem Typ
iterator::distance_type? Ist der implementierungsspezifisch?
-
Das ist doch der Sinn von Traits, dass man PODs, genau so wie Klassen verwenden kann. DIe Iterator-Traits sind dann z.B. für Zeiger spezialisiert. Könnte man einfach mit iterator_t::difference_type auf den Typen zugreifen, wären Iterator-Traits ja vollkommen sinnlos.
Und ja, ich glaube im Release-Modus sehen zumindest einige Vektor-Implementationen so aus:
template <typename T, ...> class vector { public: typedef T* iterator; typedef T const* const_iterator; ... ...Gruß
Don06
-
Okay, danke, wieder was gelernt. Mit den Traits hatte ich bisher gar nie zu tun...
-
Nexus schrieb:
Okay, danke, wieder was gelernt. Mit den Traits hatte ich bisher gar nie zu tun...
Da siehst du im übrigen auch die Spezialisierungen aufgelistet:
http://www.cplusplus.com/reference/std/iterator/iterator_traits.htmlGrüssli
PS: Ist jemand schon aufgefallen, dass die Seite erweitert wurde?
-> http://www.cplusplus.com/reference/std/
Da hat es inzwischen fast alle Punkte, was die Referenz nun endlich wohl vollständig macht. Auch die locales sind endlich vorhanden mit allem drum und dran.
-> http://www.cplusplus.com/reference/std/locale/(ok, das ist aber nun sehr off-topic, sry :))
-
Ein Zeiger ist ein gültiger Iterator.
Sich darauf zu verlassen dass Iterator-Typen irgendwelche Typedefs oder Memberfunktionen haben == asking for trouble.D.h. "iter.begin()" und "iter.end()" kann schonmal nicht funktionieren. Bzw. besser: muss nicht funktionieren, und funktioniert auch normalerweise nicht.