iterator auf string vector, typ der von distance zurückgegeben wird



  • KasF schrieb:

    Der Rückgabetyp ist iterator::difference_typ vom übergebenen iterator.

    vector<string>::iterator::difference_type
    

  • Administrator

    @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 ;D
    

    ich 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...


  • Administrator

    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.html

    Grü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.


Anmelden zum Antworten