struct operator< über mehrere Members

HPB

Erfahrenes Mitglied
Hallo,
ich habe eine Struktur
Code:
struct myStruct
{
 int a;
 int b;
 int c;
 int d;
};

Jetzt brauche ich einen "Kleiner Operator". Wie schreibe ich ihn am effizientesten, um mit möglichst wenig Vergleichen auszukommen?

Es gibt keine tatsächliche Reihenfolge. Die Struktur dient als Schlüssel einer Map, es geht mir also ausschließlich darum, zu überprüfen, ob zwei Instanzen der Struktur unterschiedlich sind.

Mein bisheriger Ansatz ist
Code:
bool operator<(const myStruct& other) const
{
 if (a<other.a) return true;
 if(a==other.a)
 {
   if(b<other.b) return true;
   if(b==other.b)
   {
   ...//und so weiter...
   }
 }
 return false;
}

Gruß,
Peter
 
"Es gibt leider keinen portablen oder sinnvollen Weg, zwei Strukturen direkt miteinander
zu vergleichen. Das Problem liegt darin, dass ein Compiler aus Optimierungsgründen Lücken
zwischen den einzelnen Elementen lassen kann."

Quelle: http://www.galileo-press.de/openbook/c_von_a_bis_z/c_017_004.htm#RxxobKap017004040029AB1F01F18C

Also bleibt nix anderes übrig als alles per Hand zu verlgeichen ):
Außer jemand weiß einen besseren weg, ich leider nicht...

Aber hab trotzdem ein Tipp:

Code:
if (a<other.a) return true;
 if(a==other.a)
 {
   ....

würde ich so machen

Code:
if( struct1.a ^ struct2.a ) return false;
if( struct1.b ^ struct2.b ) return false;
if( struct1.c ^ struct2.c ) return false;
if( struct1.d ^ struct2.d ) return false;
return true;

Wenn man einen Wert mit einem gleichen Wert XOR'd kommt 0 raus (mehr Infos unten).
D.h. wenn beide Werte verschieden sind kommt irgendeine Zahl raus, wenn das passiert
ist die if-Abfrage gültig und führt den Returnbefehl false für Ungleicheit aus :)
Wenn beide Strukturen gleich sind wird am Ende ein true für Gleicheit zurückgegeben

Weiß auch nicht genau warum das besser ist, aber in Assembler sehe ich
das die meisten so auf Gleicheit prüfen :) (Hoffe ich rede kein Mist...)

Edit: Ich glaube ich habs mit dem reseten einer Variable vertauscht...
Aber dürfte trotzdem noch bissel schneller gehen hoffe ich mal ^^

PS.:

Mehr Infos zu XOR gibts hier: http://www.galileo-press.de/openbook/c_von_a_bis_z/c_008_004.htm#RxxobKap008004040026A21F0291DA
 
Zuletzt bearbeitet:
Zurück