[Gelöst] Iteratorarithmetik



  • Hallo 🙂

    Ich hätte da eine Frage bezüglich Iteratorarithmetik.

    Im (C++ Primer Übung 3.22) heisst es:

    Was geschieht, wenn wir mid folgendermassen berechnen:

    vector<int>::iterator mid = (vi.begin() + vi.end()) / 2;
    

    Ich habe einen Vektor mit 9 Elementen erstellt und verschiedene Versuche durchgeführt einem Iterator solch einen Wert durch so eine arithmetische Operation zu vergeben, aber der Compiler gibt da eine sehr lange Fehlermeldung raus. (...error: no math for 'operator+'...).

    Andere Operationen wie (vi.begin()+2, vi.end()-4...) funktionieren sehr gut.

    Ist es normal dass das so überhaupt nicht funktioniert, oder mache ich da etwas falsch.

    Wäre sehr dankbar wen mir jemand da helfen kann 😃

    Gruss



  • Du kannst Iteratoren und Zeiger nicht dividieren.

    Einen Iterator in die Mitte kriegst du mit:

    vi.begin() + vi.size() / 2;
    

    Und das ist wiederum äquivalent mit:

    vi.begin() + (vi.end() - vi.begin()) / 2;
    

    Du darfst aber 1/2 nicht ausklammern, weil du nur Differenzen (ganze Zahlen als relative Offsets), aber keine Iteratoren (absolute Positionen) multiplizieren und dividieren kannst.


  • Mod

    Eigentlich ist das normal, dass das nicht funktioniert. Die Summe von zwei Iteratoren kann nichts sinnvolles sein, daher gibt es auch kein + dafür. Genauso wie es kein geteilt gibt. Kann es sein, dass das genau der Punkte ist, den der Primer an der Stelle machen will?



  • @Nexus
    Das mit dem Iterator in der Mitte ist im Buch auch so beschreiben.
    Aber jezt ist mir klar, dass das andere nicht funktionieren kann.

    @SeppJ
    Hmm... im Buch endet zwar der Abschnitt Iteratorarithmetik mit dieser Übung, aber ja es ist gut denkbar das C++ Primer auf diesen Punkt hinweisen möchte.

    Vielen Dank für eure Hilfe!


Anmelden zum Antworten