Verständnisfrage bzgl std::vector insert()



  • Hallo zusammen,

    ich bastele gerade an einer Zwischenschicht einer grafischen Anzeige. Ich mache weder die eigentlich Anzeige noch die Datenbeschaffung, sondern lediglich die Vorbereitung für die Ausgabe.

    Man stelle sich folgendes Diagramm vor:

    |
    |
    |
    |    *
    |    *     *           *
    |    *     *     *     *     *   
    |    *     *     *     *     *
    -----|-----|-----|-----|-----|
      Fräs  Dreh  Putz  Pack  Post
    

    Das Diagramm dient nur zur Verdeutlichung und ist frei erfunden.
    Hier wäre also beispielsweise "Dauer pro Arbeitsschritt" dargestellt.

    Die Information "Dauer pro Arbeitsschritt" erhalte ich in einem Vektor von Arbeitsschritten, der dann einfach Element für Element im Diagramm dargestellt wird. Allerdings kann es sein, daß ein Schritt ausgelassen wird.

    Ich muss also für ausgelassene Schritte einen Dummy einfügen.

    Die FRAGE:

    Fügt insert() "an Position X", also "vor dem Element, das gegenwärtig an Position X steht" ein oder "danach"?

    Die ZWEITE FRAGE:
    Angenommen, ich laufe mit einer Schleife

    for (std::vector<elem>::iterator iter = vec.begin(); iter != vec.end(); ++iter)
    

    über den Vektor.

    Wenn die Einfügeoperation "nach Element X" einfügen würde, wäre alles kein Problem: Einfach insert aufrufen und mit dem zurückgegebenen Iterator weiter darüberlaufen.

    Wenn jedoch insert() "vor Element X" einfügt, und ich eine Einfügeoperation "dahinter" wünsche, so muss ich den Iterator ein Element hochzählen, und dann die Einfügeoperation ausführen. Was passiert, wenn ich dabei vom letzten Element des Vektors ausgehe? Was passiert also, wenn ich einen Iterator, der auf das letzte Element zeigt, um eins erhöhe? Erhalte ich dann vec.end() (dann wäre alles in Ordnung) oder muss ich hier eine Sonderfallprüfung durchführen?

    Danke im Voraus

    Sid



  • vector::insert() fügt VOR der angegebenen Position ein (und gibt einen Iterator auf das neue Element zurück). Und erschwerend für deine Schleifenkonstruktion kommt noch dazu, daß die Operation alle Iteratoren im vector ungültig machen kann.

    PS: Wenn du den Iterator auf das letzte Element erhöhst, landest du auf end()



  • Hallo CStoll,

    das insert in diesem Fall meine Vektoren ungültig macht, ist mir klar.

    Mein Lösungsansatz war dafür allerdings folgender:

    for (iterator iter, != end, ++iter) // stilisiert
    {
    
      if (bedingung)
      {
        iterator where = iter;
        iter = vec.insert(where, newItem);
      }
    
    }
    

    Da ich einen neuen, gültigen Iterator zurückbekomme, müsste das doch eigentlich so funktionieren - oder sehe ich das falsch?

    Danke im Voraus.

    Gruss
    Sid



  • Iteratoren. Es macht natürlich die ITERATOREN ungültig. Gnarf.

    Gruss
    Sid



  • Ja, das müsste funktionieren - wobei es imho nicht nötig ist, den alten Iterator nochmal zwischenzulagern.



  • Hallo CStoll,

    ich hatte nur etwas Bedenken mit dem Lesen und Schreiben des Iterators innerhalb einer Zuweisung. Better safe than sorry 😉

    Danke für die Hilfe.

    Sid


Log in to reply