C++ - STL-map-container mit class-Schlüssel und Klasse Wert
Also angenommen ich habe eine Klasse wie diese:
class Point
{
private:
int x, y;
public:
void setX(int arg_x) { x = arg_x; }
void sety(int arg_y) { y = arg_y; }
int getX() const { return x; }
int gety() const { return y; }
};
Nun möchte ich eine Karte wie diese:
map<Point, Point> m;
Aber ich brauche einen Dritten parameter. Ich lese in cplusplus, dass dieser Dritte parameter ist der Vergleich etwas, aber ich Verstand nicht, was dieses etwas war. Kann mir jemand erklären für mich?
- wo wollen Sie einen Dritten parameter? Und was für? Möchten Sie Sie speichern 2 Punkte und etwas anderes in der Karte?
- Wenn du gehst zu halten Sie die set - /get-Funktionen, dann benutzen Sie die öffentlichen Mitglieder:
struct Point { int x, y; };
ist besser.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erweitern Sie Ihre Klasse mit einer solchen Methode, wenn Sie brauchen nicht eine separate Funktion vergleichen
Standardmäßig werden die stl-map ordnet alle Elemente in es von einigen Begriff von der Bestellung. In diesem Fall wird dieser operator verwendet wird. Manchmal ist Sie nicht die Kontrolle über den Punkt, Klasse oder möchten Sie vielleicht, um es in zwei unterschiedlichen Karten jeder definiert seine eigene Bestellung. Zum Beispiel eine Karte zu Sortieren Punkte, die von x den ersten und die anderen könnte man Sortieren nach y-ersten. So könnte es hilfreich sein, wenn der Vergleichsoperator ist unabhängig von der Klasse Punkt. Sie können so etwas wie dies tun.
Was Sie brauchen, ist zu definieren eine Reihenfolge von Punkt-Elemente.
Dies kann auf verschiedene Arten erfolgen :
Überlastung der
operator <
für PunktKönnen Sie eine überlastung der
<
Betreiber, deren Prototyp ist :Beispielsweise für meine tests habe ich folgende :
Dies ist der einfachste Weg, aber es wird davon ausgegangen, semantisch, dass die Reihenfolge oben definiert, ist der rechts Standard-one.
Bietet einen Funktor
Wenn Sie nicht bereit sind, um eine
<
Betreiber, oder wollen Sie haben mehrere Karten, jede mit seiner eigenen Bestellung, Ihre Lösung ist ein Funktor auf der Karte. Dies ist die Dritte Vorlage definierten parameter für die Karte:Den Funktor muss folgende Signatur haben :
So, für meine tests habe, schrieb ich einfach Folgendes :
Und es in meine map:
Et voilà...
Spezialisiert
std::less
fürPoint
Sehe ich keinen Sinn, dies zu tun, aber es ist immer gut zu wissen: Sie können sich spezialisieren, die
std::less
template-Struktur für IhrePoint
KlasseDies hat die gleiche Wirkung wie eine überlastung des
operator <
, zumindest so weit wie die Karte betroffen ist.Als für die
operator <
Lösung vor, semantisch, diese Lösung wird davon ausgegangen, dass die Reihenfolge oben definiert ist der richtige Standard ein so weit wiestd:less
betroffen ist.Beachten Sie, dass die Standard -
std::less
Implementierung ruft dieoperator <
von den Vorlagen geben. Dass einer mit dem anderen Ergebnissen als die anderen betrachtet werden könnte als einen semantischen Fehler.Wenn Sie eine benutzerdefinierte Klasse als Schlüssel in std::map, um zu bestimmen, die position der Elemente im container die Karte braucht den Vergleich Klasse: Eine Klasse, die zwei Argumente nimmt die Schlüssel geben und einen bool zurückgibt.
Es ist im Grunde ein Vergleich functor/Funktion vergleicht zwei wichtige Werte.
Brauchen Sie nicht Dritten parameter müssen Sie nur die
operator==
undoperator<
operator==
für die bestellten Container.Ich denke, der code oben gibt ein kleines upgrade zu @parapura rajkumar Lösungen.
Was sagen Sie als Dritten parameter heißt "Komparator" in STL.
Für Standard-Typen als Schlüssel youy nicht brauchen, um ein als compiler
tut diese Arbeit für Sie.
Aber für Ihre definierten Typen, die Sie haben, um anzugeben ODER sonst wie würde der compiler pflegen
die Sortierung in anzeigen/einstellen etc.