Ja, die zweite Version kann optimaler sein, solange Ihr Container niemals modifiziert wird aber kann der Compiler nicht sagen, dass der Container nie modifiziert wurde.
Die "optimalste" Schleifenstruktur kann gefunden werden, indem die C ++ 11-basierte for
-Schleife untersucht wird.
Der Code:
%Vor%wird grob in:
übersetzt %Vor% wobei eine Variable, die mit __
beginnt, nur zu Darstellungszwecken existiert und die using std::begin; using std::end;
wird aus der Betrachtung innerhalb von // body
entfernt. (Beachten Sie, dass jede Variable, die __
enthält, für die Compilerimplementierung reserviert ist.)
Wenn Sie in Ihrem Compiler eine Lambda-Unterstützung haben, können Sie Ihre eigene Version schreiben:
%Vor%Das wird so verwendet:
%Vor%es lässt Sie nicht brechen oder in den äußeren Bereich zurückkehren, aber es ist ziemlich nah an C ++ 11 auf der Grundlage von Entfernungsberechnungen für.
Wenn dir sowohl auf Distanz basierende als auch Lambdas fehlen, könntest du eine völlig wahnsinnige Person sein und viel von dem oben genannten als Makro implementieren ... Arbeitet die std::begin
mit einer Hilfsfunktion mit perfekter Vorausplanung, um die Verschmutzung zu vermeiden Körper der Funktion, mayhap.
Das solltest du nicht. Da einige Operationen wie erase
den Iterator ungültig machen können.
Wenn Sie sicher sind, dass solche Operationen in der for
-Schleife nicht vorkommen, können Sie dies tun. Aber normalerweise wird der Compiler die Optimierung für Sie tun. (wenn Sie das Optimierungs-Flag aktivieren)