vector iterator



  • Hallo,
    ich hab eine frage und zwar hat man folgendes:

    std::vector<int> v;
    for (auto it = v.begin(); it < v.end(); ++it)
    {
        if (/*irgendeine bedingung*/)
             v.push_back(42);
    
    }
    

    jetzt meine frage, wird v.end() nur einmal am anfang aufgerufen, oder wird es mit jedem schleifendurchlauf aufgerufen ?
    danke schon mal
    vario-500



  • vario-500 schrieb:

    std::vector<int> v;
    for (auto it = v.begin(); it < v.end(); ++it)
    {
        if (/*irgendeine bedingung*/)
             v.push_back(42);
    
    }
    

    jetzt meine frage, wird v.end() nur einmal am anfang aufgerufen, oder wird es mit jedem schleifendurchlauf aufgerufen ?

    Natürlich bei jedem Schleifendurchlauf. Wenn du es nur einmal aufrufen willst, musst du

    for (auto it = v.begin(), end=v.end(); it < end; ++it)
    

    schreiben.

    ABER:
    mit v.push_back() invalidierst du alle iteratoren die auf v verweisen. Der Code funktioniert so also nicht.



  • Shade Of Mine schrieb:

    mit v.push_back() invalidierst du alle iteratoren die auf v verweisen. Der Code funktioniert so also nicht.

    stimmt, daran hab ich gerade gar nicht gedacht. wie kann ich es denn umschreiben, damit es funktioniert? mir fällt spontan nur als lösung ein, dass man sich den index von dem element holt, auf das der iterator gerade zeigt und dann nach dem push_back einen neuen iterator konstruiert, von dem index dann, den man sich gemerkt hat.



  • Ja, könntest du machen. Index mit std::distance(v.begin(), it) holen und Iterator wieder mit v.begin() + index zuweisen.

    In dem Fall brauchst du aber Random Access, da kannst du gleich mittels Indizes iterieren.



  • das problem an der sache ist nur, dass ich kein std::vector hab, sondern ein boost::flat_set, das ja auf einem vector aufgebaut ist, da muss ich mir dann den neuen iterator so erstellen, da es keinen index operator gibt: auto it = set.begin() + dist; aber das passt.
    danke :xmas1:



  • Wie wäre es, einfach end() zu benutzen, wenn man schon weiß, dass sich die iteratoren immer ändern, anstatt das end() des Containers nach zubauen?



  • Simpel schrieb:

    Wie wäre es, einfach end() zu benutzen, wenn man schon weiß, dass sich die iteratoren immer ändern, anstatt das end() des Containers nach zubauen?

    wo bau ich denn das end() des containers nach ?



  • Sry, mein Fehler, hab ich falsch verstanden. War wohl zu "früh" am morgen 😉


Anmelden zum Antworten