Schreiben eines Operators & lt; () für eine Struktur scheint klarer zu sein als das Schreiben des klassischen Trivalue-Vergleichs.
zum Beispiel zum Sortieren der folgenden
%Vor%Sie können einen Operator & lt; ()
schreiben %Vor%oder eine trivalue Funktion ( normalerweise in der folgenden Weise )
%Vor%Ersteres ist klarer, daher kann man sagen, dass es bessere Codequalität gibt. Letzteres zwingt Sie, an 3 Fälle zu denken, was den Code verkompliziert.
Aber dieser Gedanke trügt in komplexeren Strukturen:
%Vor%das Folgende ist klar, und Anfänger neigen dazu, es so zu schreiben
%Vor%aber es ist falsch ! Sie können damit nicht richtig sortieren!
Und es braucht etwas Zeit, um das zu denken Sie müssen es tatsächlich so schreiben
%Vor%damit es richtig funktioniert.
Können Sie und Sie diese Vergleichsfunktion auf eine schönere / klarere Art und Weise schreiben? Die alte Trivalue-Vergleichsfunktion hat Sie zumindest dazu gebracht, an & gt ;, & lt; und == Fälle zu denken.
Im Fall int
können Sie einfach schreiben:
Nur von Ihnen sprechen über einen Typ, der nicht ==
mit dem richtigen Verhalten hat, müssen Sie etwas komplexer verwenden, auch dann ist es nicht so schlimm.
Erweiterung auf weitere Mitglieder:
%Vor% Wenn Sie Ihre Mitglieder in einem Array oder einem anderen Container anordnen können, können Sie std::lexicographical_compare
verwenden.
Dies ist nicht klarer oder kürzer als Ihr letztes Beispiel, aber es hat den Vorteil, dass Sie für die Mitglieder nichts anderes als operator<
benötigen.
Der letzte Fall kann immer vereinfacht werden, leider müssen die vorherigen Fälle immer die längere Form sein.
%Vor%Eine Sache, die ich einmal gemacht habe, die ein nützliches Idiom zu sein schien, war, eine Vergleichsfunktion zu schreiben, die einen Booleschen Wert zurückgibt, der zwei Argumente plus einen Booleschen Wert, der "Bias" genannt wird, annimmt. Die Funktion gibt true zurück, wenn das erste Argument größer ist oder wenn "bias" gesetzt ist und die beiden Argumente gleich sind. Ein Vergleich, dessen Ergebnis von zwei Untervergleichen abhängt, wäre also:
%Vor%Beachten Sie, dass dies "zusätzliche" Vergleiche durchführt, da part2s verglichen werden, auch wenn der part1-Vergleich ausreichen würde, um eine Antwort zu liefern, aber redundante Tests auf Gleichheit vermeidet.
Andernfalls könnte man unter Verwendung einer dreiwertigen Logik etwas wie:
machen %Vor%Die letztere Form vermeidet unnötige Vergleiche und kann leicht auf beliebig viele Felder erweitert werden.