Standard-Bibliothekscontainer wie std::map
erfordern, dass Ihre Bestellung eine "strenge schwache Bestellung" ist, daher müssen Sie beim Entwerfen sehr vorsichtig sein.
Der typische Ansatz für ein 3-er Tupel sieht folgendermaßen aus:
%Vor% Es ist wie ein Komparator für nur x
, aber mit dem Unterschied, dass, wenn die beiden x
s gleich sind, Sie durchkommen, um y
s zu vergleichen. Wenn sie gleich sind, fallen Sie ähnlich in den z
Vergleich.
Natürlich würde boost::tuple<int,int,int>
dies völlig unnötig machen.
Aktualisieren Fügen Sie hier die all-inclusive have-your-cake-und-essen-es-zu-kein-Nachteil-Lösung hinzu. IMHO rockt es!
%Vor%Hier ist der Kicker: Alles optimiert sich weg. Kompilieren:
%Vor%Mit g ++ -O2 ergibt sich folgendes in der Baugruppe.
%Vor% Der Compiler konnte das gesamte Programm auf ... return 0
effektiv optimieren. Das ist ziemlich ordentlich.
Hier geht die einfache Antwort:
%Vor%Außerdem würde ich nach einer Neudefinition meiner Struktur suchen, die es erlaubt, std :: lexicographical_compare
zu verwenden %Vor%Wenn sie auf eine bestimmte Weise geordnet werden sollen, sollten Sie genau diesen Weg angeben (zum Beispiel durch euklidische Entfernung von 0/0/0). Wenn Sie nur verschiedene Punkte unterscheiden möchten, können Sie etwas wie
tun %Vor%