Vector<string> mit iterator durchlaufen, stehe auf dem schlauch



  • Hallo, hier erstmal der folgende simple code:

    vector<string>::iterator it = ActionVector.begin()+1;
    for(;(it -> find("BeginAction") == string::npos) and (it < ActionVector.end());it++);
    

    wenn ich diese for schleife verwende läuft it anscheinend aus dem gültigkeitsbereich hinaus. Wenn ich die gleiche Schleife ohne den "it -> find("BeginAction"...)" krams benutze und nur "it< ActionVector.end()" verwende funktioniert sie und it bleibt im gültigkeitsbereich.
    Wie kann das sein? Das and müsste ja wenn überhaupt zu einer geringeren Wiederholungszahl der Schleife führen. Woher kommt das Überschreiten der Gültigkeit von it?



  • Statt

    vector<string>::iterator it = ActionVector.begin()+1;
    for(;(it -> find("BeginAction") == string::npos) and (it < ActionVector.end());it++);
    

    besser

    vector<string>::iterator it = ActionVector.begin()+1;
    for(;(it < ActionVector.end()) and (it -> find("BeginAction") == string::npos);it++);
    

    http://de.wikipedia.org/wiki/Kurzschlussauswertung



  • Danke, daran erinnere ich mich jetzt auch gerade, hatten wir im C-Kurs an der Uni.



  • volkard schrieb:

    Statt

    vector<string>::iterator it = ActionVector.begin()+1;
    for(;(it -> find("BeginAction") == string::npos) and (it < ActionVector.end());it++);
    

    besser

    vector<string>::iterator it = ActionVector.begin()+1;
    for(;(it < ActionVector.end()) and (it -> find("BeginAction") == string::npos);it++);
    

    http://de.wikipedia.org/wiki/Kurzschlussauswertung

    Sollte besser it != ActionVector.end() sein, damit man bei Containeränderung nicht Performance verliert.

    Aber ne Frage zu der "kursschlussauswertung", ist das so vom Standard garantiert, dass die Auswertung des zweiten Terms nur erfolgt, wenn die Auswertung des ersten Terms true ergeben hat?



  • bmario_ schrieb:

    Aber ne Frage zu der "kursschlussauswertung", ist das so vom Standard garantiert, dass die Auswertung des zweiten Terms nur erfolgt, wenn die Auswertung des ersten Terms true ergeben hat?

    Ja. Steht direkt beim logischen Und-Operator.



  • bmario_ schrieb:

    Sollte besser it != ActionVector.end() sein, damit man bei Containeränderung nicht Performance verliert.

    Wird ein Iterator bei einer Containeränderung nicht sowieso ungültig?



  • Gugelmoser schrieb:

    bmario_ schrieb:

    Sollte besser it != ActionVector.end() sein, damit man bei Containeränderung nicht Performance verliert.

    Wird ein Iterator bei einer Containeränderung nicht sowieso ungültig?

    Das war nicht gemeint.
    Sondern, wenn man den Code ändert und aus dem vector eine zum Beispiel list macht.


Anmelden zum Antworten