2010-12-02 13 views
0

Ich lese gerade Informationen aus einer Eingabedatei. Von diesen Informationen gibt es einen Namen. Alle Informationen werden in eine Struktur eingelesen. Es gibt ein Array dieser Strukturen.C++ - Alphabetische Zeichenfolgen

Ich muss die Strukturen mit dem Nachnamen alphabetisch unter Verwendung eines binären Suchbaums.

Muss ich eine Operator-Überlastfunktion für ==, < und> schreiben. Wenn ja, kann mir jemand dabei helfen?

+2

:::::: Hausaufgaben? – wilhelmtell

+0

Müssen Sie zuerst den Binärbaum schreiben? – wilhelmtell

+0

Ich habe die Binary Tree Klasse schon geschrieben ...Ich bin nur verwirrt über die Überlastung des Bedieners – Johnrad

Antwort

0

Operatorüberladungen funktionieren genauso wie Funktionen oder Methoden. Sie erhalten einen Rückgabetyp und Argumente auf die gleiche Weise. Zum Beispiel wäre ein binärer Operator (wie <) eine Elementfunktion mit einem Argument oder eine freie Funktion mit zwei, je eine für jede Seite des Operators. Die einzige Sache, die anders ist, ist, anstatt einen Bezeichnerfunktionsnamen zu haben, sie verwenden eine spezielle Syntax, das Schlüsselwort operator gefolgt von dem Operator, der überladen wird. Also wenn wir einen vergleichbaren Typ haben wollten, könnten wir es so machen:

+0

Sie meinen 'const MyUserType &'. – wilhelmtell

+0

ich meine das, fix'd – SingleNegationElimination

1

Ja, Sie möchten Operatorüberladungen für == und < schreiben. (> Ist nicht erforderlich, benutzen Sie einfach den else Fall nach zB Überprüfung if (a < b);. else if (a == b))

In unserem Fall, da wir nach Nachnamen sind alphabetisiert, eine Struktur ist „kleiner als“ eine andere, wenn und nur wenn sein Nachname steht alphabetisch vor dem Nachnamen des anderen.

Also was genau ist das Problem? Wissen Sie, wie Sie Überlastungen der Bediener schreiben können? Wissen Sie, wie man Zeichenketten vergleicht und bestimmt, was zuerst alphabetisch kommt?

+0

Ich brauche nur Hilfe beim Schreiben der Operator Überladungen. Das wäre toll, wenn Sie mir dabei helfen könnten. – Johnrad

1

Sie benötigen eine Möglichkeit, zwei beliebige Instanzen der Struktur zu vergleichen. Einen Vergleichsoperator zu schreiben, sagen wir operator<(), könnte ein bequemer Weg sein, darüber zu gehen.

class Record { 
    friend bool operator<(const Record&, const Record&); 
    std::string name; 
    // ... 
}; 

bool operator<(const Record& a, const Record& b) 
{ 
    // return true if the name of a is less than the name of b 
} 

Da ein Knoten fügt entweder auf der linken oder der rechten Unterbaum subtree Sie wissen müssen, wenn ein Knoten „kleiner als“ einen anderen Knoten ist. Wenn nicht, ist es egal, ob es größer oder gleich dem anderen Knoten ist. es geht auf dem anderen Teilbaum in beide Richtungen.

Natürlich können Sie den Gleichheitsvergleich für eine andere Aufgabe benötigen. Wenn Sie das tun, ist es eine gute Idee, den ganzen Weg zu gehen und auch den Ungleichheitsoperator bereitzustellen.

Ebenfalls von Interesse ist der rel_ops Namensraum.

0

Sie müssten normalerweise < überladen, aber wenn es andere Elemente in der Struktur gibt, nach denen Sie vielleicht einmal sortieren möchten, macht es keinen Sinn, das zu tun. Sie sollten eine separate Funktion schreiben, die zwei Parameter Ihrer Struktur akzeptiert und sie mit dem Nachnamen vergleicht, wobei true zurückgegeben wird, wenn der erste vor dem zweiten steht, andernfalls false. Übergeben Sie diese Funktion dann an std :: sort. Etwas wie folgt aus:

bool compare_by_last_name(const MyStruct & lhs, const MyStruct & rhs) 
{ 
    return lhs.last_name < rhs.last_name; 
} 

// later 

vector<MyStruct> v; 

// put some elements in v 

std::sort(v.begin(), v.end(), compare_by_last_name); 

Sie werden feststellen, ich Ihre Aussage ignoriert haben „eine binäre Suchbaum verwenden“, weil ich nicht ganz weiß, was Sie meinen, aber es ist wahrscheinlich irrelevant. Hast du deine eigene Containerklasse oder so gemacht?