Warum ist es besser,'! =" Als '<' in einer Vektorschleife zu verwenden? Ich kann den Unterschied nicht sehen.Warum ist es besser, '! = "Als' <'in einer Vektorschleife zu verwenden? (C++)
Antwort
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.
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()
Einige Iteratortypen unterstützen den Less-Than-Operator nicht Unterstützen Sie nur den Ungleichheitsoperator. Deshalb sehen Sie oft den Less-Than-Operator.
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.
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.
Ausgenommen einige Iteratoren erlauben nicht
+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
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. –
Ein weiterer Grund: Wenn in Assembly übersetzt wird, ist eine Verzweigung-gleich oder Verzweigung-ungleich-im Allgemeinen viel schneller als ein Vergleichszweig.
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
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.
- 1. Warum ist es besser, zu sperren (objLock) als Sperre (this)
- 2. Ist es besser, Sitzungsattribute als Instanzfelder in Servlets zu verwenden?
- 3. Welches ist besser zu verwenden und warum in C#
- 4. Warum ist `[` besser als `Teilmenge`?
- 5. Warum ist "vector.at (x)" besser als "vector [x]" in C++?
- 6. Wann ist "Or" besser zu verwenden als "OrElse"?
- 7. In object.initialize ist es besser, self zu verwenden. Über @?
- 8. Warum ist es nicht erlaubt, toString() als Standardmethode zu verwenden?
- 9. Ist es besser, Bitmap oder EncoderedImage in BlackBerry zu verwenden?
- 10. Ist es besser, Liste oder Sammlung zu verwenden?
- 11. Ist es besser, jQuery fadeIn oder CSS3 Animationen zu verwenden?
- 12. Warum Protokoll ist besser als Klasse in Swift?
- 13. Ist es besser, Benutzerdaten in einer Datenbank als in Cookies zu speichern?
- 14. Ist es wichtig, <label> in HTML zu verwenden?
- 15. Was ist besser in Java zu verwenden? x <= 10 oder x <11?
- 16. Ist es besser, Float zu verwenden, anstatt float und int in einer großen Berechnung zu mischen?
- 17. Ist es besser DateTime.MinValue oder eine Nullable DateTime zu verwenden?
- 18. Wie funktioniert "<% = request.getContextPath()%>" besser als "../"
- 19. Für Schleife. Warum ist es kleiner als <nicht kleiner als oder gleich <=?
- 20. Ist es besser, eingebettetes JavaScript oder eine separate .js-Datei in einer MVC3-Ansicht zu verwenden?
- 21. Ist es besser, das Datenbankschema zu ändern?
- 22. Ist es besser, System.arraycopy (...) als eine for-Schleife zum Kopieren von Arrays zu verwenden?
- 23. Ist es besser, das Vorhandensein einer Variablen in einer if-Anweisung zu überprüfen oder eine guard-Anweisung zu verwenden?
- 24. Ist es in C# in Ordnung, eine andere Standardsprache der Benutzeroberfläche als Englisch zu verwenden?
- 25. Ist es besser, array.length in einem Programm mit vielen for-Schleifen zu verwenden oder ist es besser, eine Variable zu setzen und zu verwenden?
- 26. Ist es besser, ein Objektargument zu verwenden oder ein Mitgliedsobjekt zu verwenden?
- 27. Ist es möglich, einen Datensatz als Datensatzelement zu verwenden?
- 28. Ist es in Java besser zu vermeiden, explizit Datenbankspaltennamen, Datentypen usw. zu verwenden?
- 29. Ist es möglich, Signal innerhalb einer C++ - Klasse zu verwenden?
- 30. Ist das from-Schlüsselwort besser als direkte Methodenaufrufe in C#?
Wenn Sie beabsichtigen, openmp zu verwenden, ist '<' tatsächlich besser als '! =' (Das letzte ist kein gültiges Kontrollprädikat). –