2009-05-16 4 views

Antwort

22

Da Sie Iteratoren verwenden und die Schleife genau so aussieht wie andere Container, sollten Sie zu anderen Containertypen wechseln, z. B. set, list, unordered_set usw. < hat keine Bedeutung.

1

Für Vektor-Iteratoren spielt es keine Rolle. Im Allgemeinen unterstützen Iteratoren '<' nur '==' und '! =' Nicht. Daher ist die allgemeinste Art zu testen, ob Sie das Ende der Sammlung nicht erreicht haben, zu überprüfen, ob der Iterator! = Container.end()

6

Einige Iteratortypen unterstützen den Less-Than-Operator nicht Unterstützen Sie nur den Ungleichheitsoperator. Deshalb sehen Sie oft den Less-Than-Operator.

8

Ich nehme an, dass Sie die Verwendung von !=vector.end() anstatt <vector.size() als das aus Ihrer Frage nicht klar ist.

Ein Grund, die end() - Version zu bevorzugen, ist, dass Sie wirklich versuchen, zu überprüfen, ob Sie das Ende erreicht haben.

Das Idiom für diese Art von Prüfungen für Arrays in C war, den Index im Vergleich zu der Größe zu überprüfen, aber das ist ein "Legacy" Verhalten. Es wurde dann in der Welt von Java verbreitet (wie < array.length) bis zu dem Zeitpunkt, an dem die Leute erkannten, dass Arrays böse sind und dass Java schließlich Generika unterstützt. In C++ gibt es jedoch keinen Grund, dieses Idiom zu verwenden, wenn Sie über eine gute Erfassungsklasse wie Vektor verfügen. Es ist lesbarer und wartbarer. Es erleichtert beispielsweise den Wechsel zu anderen Sammlungen, da Sie immer noch über das Ende sprechen.

2

Es könnte sein, dass sich der Programmierer an einen defensiven Programmiertrick erinnert: Falls etwas während der Ausführung der Schleife drunter und drüber geht und der Index/Zeiger/Iterator weit über das Ende hinausgeht, wird die Schleife still stehen, wenn '<' verlassen wird der Bug unbemerkt. Mit! = Wird es wahrscheinlich Chaos und einen Absturz geben, da die Schleife mit schlechten Daten fortfährt, was eine frühere Behebung erlaubt.

+0

Ausgenommen einige Iteratoren erlauben nicht

+0

+1: Dieser defensive Programmiertrick ermöglicht es Ihnen auch, die Korrektheit Ihrer Schleife statistisch zu analysieren und zu beweisen. Wenn die Schleife normal endet, sagt die Bedingung "a! = B", dass sie beendet wurde, weil genau "a == b", z. Der Schleifenkörper wurde genau so oft ausgeführt, wie Sie es erwartet hatten. Die Bedingung "a = b", z. Der Schleifenkörper wurde mindestens so oft ausgeführt, wie Sie es erwartet haben, vielleicht mehr. Verwandte Frage: http: // stackoverflow.com/questions/132164/loop-termination-conditions – palm3D

+0

Dieser defensive Programmiertrick macht das Programm auch robust gegen [Cloudbleed] (https://blog.cloudflare.com/incident-report-on-memory-leak-cracted-by- cloudflare-parser-bug /) - Geben Sie Szenarien ein. Und der Computer macht keine zusätzliche Arbeit. Der Nachteil ist der bereits erwähnte Verlust der Allgemeinheit. –

-1

Ein weiterer Grund: Wenn in Assembly übersetzt wird, ist eine Verzweigung-gleich oder Verzweigung-ungleich-im Allgemeinen viel schneller als ein Vergleichszweig.

+3

Haben Sie Unterlagen dafür? Ich habe immer angenommen, dass es sich in jedem Fall um eine Subtraktion handelt - im Fall eq/neq überprüfen Sie das Null-Flag, und im weniger Fall prüfen Sie das negative Flag. – Eclipse

3

Im Allgemeinen mag ich Code wie diesen in eine Template-Funktion ähnlich den STL-Algorithmen, so dass sie agnostic über die zugrunde liegenden container sind.

Da < nur für Vektoren sinnvoll ist, wäre es für eine generische Funktion schlecht geeignet. Wenn Sie < verwenden, sperren Sie sich in die Verwendung eines Vektors.

Verwandte Themen