Frage

for (int i = 0 ; i < stlVector.size() ; i++)
{ 
    if (i == 10)
    { 
        stlVector.erase(stlVector.begin() + 5 )
    }
}

Ist die Abbruchbedingung Teil "stlVector.size ()" übernehmen "stlVector.erase (...)" in Betracht? Mit anderen Worten ist aufzufrischen stlVector.size () bei jeder Iteration? Ich kann es jetzt nicht testen, so dass ich hier eine Frage gestellt.

Thx im Voraus!

Mit freundlichen Grüßen,

zhengtonic

War es hilfreich?

Lösung

Just klar zu sein, glaube nicht, es im Hinblick auf die Schleife erfrischend etwas. Jedesmal, wenn die Bedingung (zu Beginn jedes Mal durch die Schleife), die Größe () Methode auf dem stlVector Variable aufgerufen wird, überprüft wird, und die aktuelle Größe des Vektors zurückgegeben.

Die Lösch- () Methode, die Größe des Vektors reduziert, so dass das nächste Mal, size () aufgerufen wird, wird der zurückgegebene Wert kleiner sein.

Andere Tipps

Ja, es funktioniert!

stlVector.size () // is called for evey iteration

Damit für jeden Schleifen Sie den Test haben werden "i

Ja, wird der Test durchgeführt wird, mit Nebenwirkungen, für jede Schleife.

Ein for-Schleife ist nur eine nette Konvention - ein for-Schleife leicht als eine while-Schleife zerlegt wird:

for (int i = 0 ; i < stlVector.size() ; i++)
{ 
    if (i == 10)
    { 
        stlVector.erase(stlVector.begin() + 5 )
    }
}

Wird:

int i = 0 ;

while(i < stlVector.size())
{ 
    if (i == 10)
    { 
        stlVector.erase(stlVector.begin() + 5 )
    }
    i++;
}

-Adam

Ja, es funktioniert, aber dies nicht tun! Wenn Sie von einem Vektor-Elemente entfernen möchten, tun Sie es in einer anderen Schleife. Sie löschen Elemente nach dem i-Index in diesem Fall: nichts garantiert, dass die stlVector [i + 5] Element vorhanden ist. Wenn Sie das i-te Element aus dem Vektor entfernen, Ihre Zählung gebrochen ist, weil Sie Elemente ohne sie überprüfen springen können.

Der sicherste Weg dies zu tun ist, Referenzen für die Elemente auf dem stlVector Speichern Sie auf einem anderen Vektor zu löschen, und dann iterieren auf diesem auxiliar Vektor tun stlVector.erase (auxVector [i]).

erwarte ich, dass der Code, den Sie zur Verfügung gestellt ist gerade „Fantasie-Code“ (wie ein Kommentator es ausdrückte) ein konkretes Beispiel für die Art der Sache zu geben Sie versuchen zu tun.

Allerdings nur für den Fall ist es nicht: die Schleife Sie gab das 12. Element überspringen (dh das Element in stlVector[11] ursprünglich), weil, wenn stlVector[10] untersuchen Sie ein früheres Element löschen, so dass alle späteren Elemente Shunt eine Position weiter, aber Sie haben noch i am Ende der Schleife erhöhen. So wird die nächste Iteration bei stlVector[11] suchen, die eigentlich das Element, das ursprünglich in stlVector[12] war. Um dies zu beheben, müssen Sie nach dem Aufruf von --i erase().

Immer neu zu bewerten sicher!

, auch ein bisschen zu klären, da Sie gefragt, ob es auf diese Weise „in VC ++ 6“ getan hat.

Das "continue Zustand" ist neu zu bewerten, auf jeder Schleife in jeder Version von C, C ++, C # und Java.

Wenn eine complier generiert keinen Code, der das tut, es ist gebrochen, und muss vermieden werden.

Wie andere gesagt haben, ja die Bedingung wird jedes Mal durch die Schleife erneut ausgewertet. Deshalb ist eine gemeinsame Performance-Optimierung ist:

int saveSize = someExpensiveComputation();

for (int i = 0 ; i < saveSize ; i++)
{ 
    foo(i);
}

, wo die bedingte Schleife an alle teuer zu berechnen, statt

for (int i = 0 ; i < someExpensiveComputation(); i++)
{ 
    foo(i);
}

Wenn die teure Berechnung unnötig jede Iteration durch die Schleife durchgeführt wird.

Ja, es reduziert die Größe. Weitere Informationen finden Sie hier

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top