Warum ist ein Itearotor kein Zeiger?



  • Ich würde sagen: Weil man zur Zeiten von Zeigern noch keine "Iteratoren" (als Konzept) kannte und man deshalb "Referenz" und "Iterator" in einen Topf geschmissen und durch das naheliegenste technische Konstrukt abgebildet hat, das man fand. 😃

    Gruß,

    Simon2.



  • Achso, vielen Dank 🙂

    Jetzt habe ich aber eine weitere Frage.
    Sind Iteratoren den Indicies vorzuziehen?
    Ich denke man kann das nicht so ganz allgemein sagen, aber
    sind sie mehr als nur eine Modeerscheinung?

    Noch eine Frage. Ich möchte mithilfe von Iteratoren alle leerzeichen
    aus einem std::string löschen.

    for( std::string::iterator it = string.beg(); it != string.end(); ++it )
    {
        if( *it == ' ' )
        {
            string.erase( it ); 
            // da alle zeichen jetzt eins nach vorne rücken muss die position
            // nochmal geprüft werden
            --it; 
        }
    }
    

    jetzt habe ich das Problem, dass dies nicht klappt wenn der string nur aus
    einem Leerzeichen besteht.
    Ich denke es liegt daran, dass wenn der String leer ist string.end() nicht das
    ist wie it.



  • der iterator wird durch den schreibzugriff ungültig, das --it ist also in jedem fall falsch.



  • mhhh,

    und wie bekomme ich das hin?
    Irgendwie bin ich jetzt total verwirrt.
    Eigentlich müsste es doch ganz einfach gehen.



  • Wenn ich mich recht erinnere liefert erase (und insert auch iirc) netterweise den nächsten gültigen Iterator zurück.

    =>

    for( std::string::iterator it = string.beg(); it != string.end(); ++it )
        if( *it == ' ' )
            it = string.erase( it );
    

  • Mod

    s.erase(remove(s.begin(),s.end(),' '),s.end());
    


  • Vielen Dank, jetzt ist mir alles klar 🙂
    Sind doch ganz nützlich diese Dinger 😉

    Kleine speziellere Frage zu strings noch.

    std::string string( "1234567" );
    
    std::string::reverse_iterator r_it = string.rbegin();
    std::string::iterator it = string.begin();
    string.erase( it, r_it );
    

    Jetzt mosert der Compiler rum, dass er r_it nich in std::string::iterator
    vonvertieren kann. Wie kann ich das umgehen?
    Man muss noch irgendwie einen _reverseiterator in einen iterator konvertieren können.



  • string.erase (it, r_it.base());
    


  • Warum sind die Iteratoren nicht durchgehend eingebaut?
    Ich kann bei einem std::string Iteratoren beim einfügen
    löschen usw benutzen. Wenn ich aber einen substr haben möchte
    werden wieder nur Indicies akzeptiert.



  • Substring liefert (leider) eine Kopie des Bereiches. Und die bekommst du auch mit dem handelsüblichen std::string-Iteratorkonstruktor.



  • Iterator__ schrieb:

    Warum sind die Iteratoren nicht durchgehend eingebaut?
    Ich kann bei einem std::string Iteratoren beim einfügen
    löschen usw benutzen. Wenn ich aber einen substr haben möchte
    werden wieder nur Indicies akzeptiert.

    Weil std::string leider "suboptimal" designed ist (was sich nicht nur bei diesem Punkt zeigt)...
    Leider konnte sich das Standardkomitee nicht entscheiden, ob sie string als char-Container oder als "Textklasse" sehe möchte.

    Gruß,

    Simon2.


Anmelden zum Antworten