Wie kann ich meine eigenen comparator für eine Karte?
typedef map<string, string> myMap;
Beim einfügen eines neuen paar zu myMap
zu verwenden, wird der Schlüssel string
zu vergleichen, durch seine eigene string-Vergleicher. Ist es möglich, dass überschreiben Komparator? Zum Beispiel würde ich gerne vergleichen Sie die Taste string
durch seine Länge, nicht durch das alphabet. Oder gibt es irgendeine andere Möglichkeit zum Sortieren der Karte?
Du musst angemeldet sein, um einen Kommentar abzugeben.
std::map
dauert bis zu vier template-Typ-Argumente, die Dritte wird ein Komparator. E. g.:Alternativ könnte man auch einen Komparator zu
map
s-Konstruktor.Beachten Sie jedoch, dass beim Vergleich von Länge können Sie nur eine Zeichenfolge von jeder Länge in der Karte als ein Schlüssel.
std::map<std::string, std::string> myMap(cmpByStringLength());
std::map<int,int> m(std::less());
- beachten Sie die Klammern. Sie definitiv nicht brauchen Funktionszeiger. Wenn Sie laufen in Probleme, am besten stellen Sie eine neue Frage.cmpByStringLength
ist nicht eine Instanz vonstd::less<std::string>
. Für eine Allgemeine Karte, die kann jeder haben Komparator set im Konstruktor, müssen Sie so etwas wiestd::map<std::string, std::string, std::function<bool(const std::string &, const std::string &)>> myMap(cmpByStringLength);
Ja, die 3. Vorlagen-parameter auf
map
gibt der Komparator, der ein binäres Prädikat. Beispiel:std::binary_function
? Ist es notwendig?std::binary_function
entfernt in c++17, so dass diese Antwort könnte wahrscheinlich verwenden, zu aktualisieren.Seit C++11, Sie können auch eine lambda-Ausdruck statt der Festlegung eines Komparators struct:
Ausgabe:
Möchte ich wiederholen Sie den letzten Hinweis von Georg ' s Antwort: Beim Vergleich von Länge können Sie nur eine Zeichenfolge von jeder Länge in der Karte als ein Schlüssel.
Code auf Ideone
Geben Sie den Typ des Zeigers zu Ihrem Vergleich-Funktion als 3. geben Sie in die Karte, und stellen Sie den Funktionszeiger auf der Karte Konstruktor:
map<keyType, valueType, typeOfPointerToFunction> mapName(pointerToComparisonFunction);
Werfen Sie einen Blick auf das Beispiel unten für die Bereitstellung eine Vergleich-Funktion, um eine
map
mitvector
iterator als Schlüssel undint
als Wert.