2016-10-15 4 views
0

Ich habe eine Struktur mit zwei Datentypen, die die Operatoren kleiner als, größer als und gleichwertig implementiert haben. Ich möchte die niedriger als Operator für meine Struktur implementieren:Lower als Operator für Strukturen

struct number_pair 
{ 
    int a; 
    int b; 
    bool operator<(const pair& other) const { return ?; } 
} 

Sie müssen den Operator mehrere Instanzen der Struktur sortieren zu können. Die Reihenfolge sollte sowohl a als auch b berücksichtigen. Ich möchte keine anderen Bibliotheken als std verwenden und ich bin auf C++ 98, so dass std::tuple nicht verfügbar ist.

Ist es möglich zu erreichen, was ich will, wenn die beiden Datentypen nur die Operatoren kleiner als, größer als und gleichwertig implementiert haben? Wenn dies der Fall ist, wie würde die Implementierung des Operators aussehen und was sonst müssten Sie sonst über die Datentypen wissen, um den Operator zu implementieren?

+0

'Rückkehr this-> a b OneOfOne

+1

'return a '). – Cornstalks

+0

@OneOfOne Ich denke du hast recht, dass dies bedeuten würde, dass 'A timakro

Antwort

3

Sie lexicographical comparison wollen. Dafür gibt es eine C++ Funktion: std::lexicographical_compare. Dieser Algorithmus ist der gleiche, der zum Sortieren von std::tuple Objekten verwendet wird.

Sie können dies leicht selbst implementieren (ohne std::lexicographical_compare) wie folgt:

struct pair { 
    int a; 
    int b; 
    bool operator<(const pair& other) const { 
     return a < other.a || (a == other.a && b < other.b); 
    } 
}; 

Alternativ können Sie std::pair<int, int>, dies zu tun. Es ist bereits eine lexikografische Reihenfolge operator< definiert.

3

Um zu helfen, das zugrundeliegende Konzept zu verstehen, betrachten Sie einen einfacheren Fall des Vergleichs zweier Textstrings. Fragen Sie sich, wie vergleichen Sie zwei Saiten? Sie sollten die Antwort wissen: Vergleichen Sie das erste Zeichen jeder Zeichenfolge. Wenn sie gleich sind, gehe zum zweiten Charakter und so weiter. Ich verlasse die Details der Handhabung von Strings, die sich in der Länge unterscheiden, aber das ist das grundlegende Konzept.

Hier ist das Konzept genau das gleiche, wenn man bedenkt, dass Sie immer einen zwei Zeichenfolge haben, und geistig ersetzen die zwei Zeichen mit Ihrem a und b:

bool operator<(const pair& other) const { 
    if (a != other.a) 
     return a < other.a 
    return b < other.b; 
} 

Dies wird ausreichend sein, für diese einfacher Anwendungsfall. Bei Vorlagen und anderen komplexen Typen muss oft aus verschiedenen Gründen nur der Operator < verwendet werden. Wenn Sie die gleiche künstliche Beschränkung auferlegen, auf sich selbst, der Umsetzung Ihrer benutzerdefinierten operator< nur in Bezug auf < selbst dann:

bool operator<(const pair& other) const { 
    if (a < other.a) 
     return true; 
    if (other.a < a) 
     return false; 
    return b < other.b; 
} 
0

Während std::tuple nicht vorhanden sind, können Sie immer noch boost::tuple verwenden und boost::tie:

#include <boost/tuple/tuple.hpp> 
#include <boost/tuple/tuple_comparison.hpp> 

struct number_pair 
{ 
    int a; 
    int b; 
    bool operator<(const number_pair& other) const { 
     return boost::tie(a, b) < boost::tie(other.a, other.b); 
    } 
};