Der folgende Code sortiert eine Karte nach Schlüssel in aufsteigender Reihenfolge bei der Erstellung der Karte:
Karte> mp = 'p', 1, 'n', 2, 'q', 3, 'm', 4, 'o', 5;
für (Karte:: iterator ite = mp.Start(); ite != MP.Ende(); ITE ++)
Cout << ite->Erste << " => " << ite->zweite << endl;
Die Ausgabe ist:
M => 4
N => 2
O => 5
P => 1
Q => 3
Der tatsächliche Code für den Komparator hier ist in der Kartenvorlagespezialisierung „weniger“. Der folgende Code sortiert eine Karte nach Schlüssel in absteigender Reihenfolge während der Erstellung der Karte:
Karte> mp = 'p', 1, 'n', 2, 'q', 3, 'm', 4, 'o', 5;
für (Karte:: iterator ite = mp.Start(); ite != MP.Ende(); ITE ++)
Cout << ite->Erste << " => " << ite->zweite << endl;
Die Ausgabe ist:
Q => 3
P => 1
O => 5
N => 2
M => 4
Der tatsächliche Code für den Komparator hier ist in der Map -Vorlagenspezialisierung „größer“.
Für die oben genannten Codeproben ist die Kartenbibliothek im Programm enthalten. Das Standardvergleichsformular ist geringer. Es hätte also im vorherigen Code weggelassen werden können, um zu haben,
KarteMP
Für die Kartenvorlagespezialisierung.
Wenn der Programmierer mit dem von C ++ angebotenen Komparator nicht zufrieden ist, kann der Programmierer seine eigenen schreiben. In diesem Artikel wird erläutert, wie der Programmierer seinen eigenen Vergleich auf die Karte anwenden kann. Normaler Vergleich von Stringschlüssel ist Fallempfindlichkeit. Das Beispiel eines unempfindlichen Vergleichs wird verwendet.
Artikelinhalt
Normaler Vergleich von Stringschlüssel
Betrachten Sie eine Klasse von fünf Schülern für eine Karte mit Vornamen gegen Markierungen in einem Test wie folgt:
Mary => 70
John => 60
Susan => 50
Paul => 45
Joseph => 75
Eine C ++ - Karte für den Standard -Komparator ist im Programm weniger:
#enthalten
#enthalten
#enthalten
Verwenden von Namespace STD;
int main ()
Kartemp = "Mary", 70, "John", 60, "Susan", 50, "Paul", 45, "Joseph", 75;
für (Karte:: iterator ite = mp.Start(); ite != MP.Ende(); ITE ++)
Cout << ite->Erste << " => " << ite->zweite << endl;
Rückkehr 0;
Die Ausgabe ist:
John => 60
Joseph => 75
Mary => 70
Paul => 45
Susan => 50
Der Vergleich ist Fallempfindlichkeit. Das Programm beginnt mit der Aufnahme der iStream -Bibliothek für das Cout -Objekt. Als nächstes ist die Kartenbibliothek enthalten; und dann ist die String -Bibliothek auch enthalten. Die folgende Aussage stellt sicher, dass jeder im Programm verwendete Name aus dem Standard -Namespace stammt, sofern nicht anders angegeben.
In der Funktion main () wird die Karte mit Initialisierung deklariert. Das nächste Codesegment in der Funktion main () zeigt das sortierte Ergebnis an (nach Schlüssel).
Custom Case Unempfindlicher Vergleichsbetreiber
Das weniger als<) operator of the string class of the C++ standard library is case-sensitive. If the programmer needs a case insensitive string literal less-than operator, he has to right his own operator function. An operator is actually a function that begins in a special way.
Aus Sicht des Benutzers lautet der weniger als der Betrieb:
links < right
wo links und rechts Operanden sind. Dieser Vorgang ergibt wahr, wenn der linke Operand geringer ist als der rechte Operand. Wenn der linke Operand der rechte Operand ist oder größer ist, ergibt er falsch. Dieser Bediener wird zum Sortieren in aufsteigender Reihenfolge verwendet.
Ein kundenspezifischer Fall unempfindlich als Vergleichsbetreiber für die Saitenliteral ist:
bool operator () (char const* links, char const* rechts) const
für (; *links != '\ 0' && *richtig != '\ 0'; ++ links, ++ rechts)
if (tolower (*links) != Tolower (*rechts))
Rückkehr (Tolower (*links) < tolower(*right) );
sonst wenn ( *links != *rechts)
if ( *(links+1) == '\ 0' && *(rechts+1) == '\ 0')
Rückkehr (*links < *right);
Rückkehr (Tolower (*links) < tolower(*right));
Hier ist das Symbol für den Bediener nicht <; it is (), which is coded to mean <. The arguments, left and right, are for the left and right operands, respectively. “char const*” means the content characters cannot be changed. “const” just after the parameter list, means the key value (string) referenced, in the map, cannot be changed, relative to the key/value pair. This does not mean that the order of each key/value pair element in the map cannot be changed.
Trotz der Tatsache, dass der zielgerichtete Betreiber als () definiert wurde, < is still used within the code.
Die For-Loop vergleicht die linken und rechten Zeichenfolge, die Literale von Charakter zu Charakter vom links am meisten angezeigt werden. Es prüft, ob die ersten Zeichen jedes Operanden gleich sind, wenn beide in Kleinbuchstaben sind (Fall unempfindlich). Wenn sie nicht gleich sind, wird True zurückgegeben, wenn das linke Charakter geringer ist als der rechte Charakter; Ansonsten wird falsch zurückgegeben; und die Funktionsfunktion stoppt die Iteration, weil die Antwort erhalten wurde. Wenn sie gleich sind, setzt sich die Iteration mit dem zweiten entsprechenden Zeichenpaar fort.
Bevor der Vergleich mit dem zweiten entsprechenden Zeichenpaar fortgesetzt wird, prüft der Code, ob die entsprechenden Zeichen gleich, aber in verschiedenen Fällen waren. und wenn die Streichliterale gleich lang waren und ihre Enden erreicht haben. Wenn all dies zutrifft, kann das “für absteigender Bestellsortierung geschrieben werden, aber das wird in diesem Artikel nicht behandelt.
Vergleichsvorlagespezialisierung
In einfachen Worten lautet die Vorlagenparameterliste für die Karte:
Vorlage>
Beachten Sie den Standardvergleich von weniger. Für die obige Karte, MP und für den Fall unempfindlicher Vergleich wäre die Spezialisierung:
Karte
Wo Cicomp der Vergleich ist und es ein Typ ist. Dieser Typ ist der Name einer Struktur oder der Name einer Klasse. Die Struktur oder Klasse hat normalerweise nur ein Mitglied, nämlich die oben genannte Operatorfunktionsdefinition. In dieser Spezialisierung wurde „const char*“ anstelle des String -Typs verwendet.
Mit dem Strukturtyp sind Mitglieder, denen der Spezifizierer nicht vorausgeht, „öffentlich:“ standardmäßig, öffentlich. Mit dem Klassentyp muss die obige Bedienerfunktion ein öffentliches Mitglied sein. Die Definition von Struct Type wäre also:
Struktur Cicomp
bool operator () (char const* links, char const* rechts) const
für (; *links != '\ 0' && *richtig != '\ 0'; ++ links, ++ rechts)
if (tolower (*links) != Tolower (*rechts))
Rückkehr (Tolower (*links) < tolower(*right) );
sonst wenn ( *links != *rechts)
if ( *(links+1) == '\ 0' && *(rechts+1) == '\ 0')
Rückkehr (*links < *right);
Rückkehr (Tolower (*links) < tolower(*right));
;
Der Hauptunterschied zwischen den beiden Definitionen ist die Verwendung des Spezifizierers „öffentlich:“. Die Klassentypdefinition wäre:
Klasse cicomp
öffentlich:
bool operator () (char const* links, char const* rechts) const
für (; *links != '\ 0' && *richtig != '\ 0'; ++ links, ++ rechts)
if (tolower (*links) != Tolower (*rechts))
Rückkehr (Tolower (*links) < tolower(*right) );
sonst wenn ( *links != *rechts)
if ( *(links+1) == '\ 0' && *(rechts+1) == '\ 0')
Rückkehr (*links < *right);
Rückkehr (Tolower (*links) < tolower(*right));
;
Das Programm für diesen Komparator sollte mit:
#enthalten <&iostreamgt;
#enthalten <&mapgt;
#enthalten <&cctypegt;
Verwenden von Namespace STD;
Die CCType -Bibliothek ist für die Funktion Tolower () bestimmt.
Hauptfunktion für benutzerdefinierten Komparator
Die folgende C ++ main () -Funktion ist entweder für den Strukturart oder den Klassentyp:
int main ()
Kartemp = "Mary", 70, "John", 60, "Susan", 50, "Paul", 45, "Joseph", 75;
für (Karte:: iterator ite = mp.Start(); ite != MP.Ende(); ITE ++)
Cout << ite->Erste << " => " << ite->zweite << endl;
Rückkehr 0;
Die Ausgabe ist,
John => 60
Joseph => 75
Mary => 70
Paul => 45
Susan => 50
Für den Fall unempfindlicher String wörtlicher Vergleicher. Beachten Sie, dass die Vorlagenspezialisierung für den Iterator die gleiche wie die Vorlagenspezialisierung für die Karte entspricht.
Abschluss
Der Standardvergleich für die Kartensortierung ist geringer. Comparator ist ein Typ, dessen Name das dritte Argument der Kartenerklärung der Kartenvorlagespezialisierung ist. Dieser Typ kann eine Struktur oder eine Klasse sein, deren möglicherweise einziges Mitglied eine benutzerdefinierte Operatordefinition ist. Dieser Artikel hat den Fall für einen benutzerdefinierten, weniger als Operator gezeigt. Andere Vergleichsoperatoren können in ähnlicher Weise definiert werden.