Aus Ссылка bemerkte ich:
"Beachten Sie, dass keine dieser Operationen das interne Vergleichsobjekt eines Containers berücksichtigt, sondern die Elemente (vom Typ value_type) direkt miteinander vergleicht."
das heißt, dass der überladene Operator "& lt;" verwendet nicht Compare
in seiner Deklaration
(Siehe Ссылка )
wo Compare
ist
Vergleichen: Ein binäres Prädikat, das zwei Elementschlüssel als Argumente akzeptiert und gibt
bool
zurück. Der Ausdruckcomp(a,b)
, wobeicomp
ein Objekt ist von diesem Typ unda
undb
sind Schlüsselwerte, sollen true zurückgeben, wenna
ist betrachtet, um vorb
in der strengen schwachen Reihenfolge der Funktion zu gehen definiert. Das Map-Objekt verwendet diesen Ausdruck, um beides zu bestimmen Reihenfolge der Elemente folgen im Container und ob zwei Elemente Schlüssel sind gleichwertig (indem sie sie reflexiv vergleichen: sie sind gleichwertig wenn!comp(a,b) && !comp(b,a))
. Keine zwei Elemente in einer Karte Container kann äquivalente Schlüssel haben. Dies kann ein Funktionszeiger oder sein ein Funktionsobjekt (siehe Konstruktor für ein Beispiel). Dies ist standardmäßig aufless<T>
, was dasselbe ergibt wie die Anwendung des Less-Than-Operators %Code%. Als Mitgliedstyp(a<b)
aliasiert.
Ich verstehe es nicht ganz, warum nicht einfach map::key_compare
im "& lt;" Betreiber?
Warum
verwendetstd::map
overloadedoperator <
nichtCompare
Ein sehr guter Grund ist, dass es nicht einfach ist, ein sinnvolles Verhalten sicherzustellen. Da der Compare
- Funktor zustandsbehaftet sein kann, können zwei Maps desselben Typs völlig unterschiedliche Sortierkriterien haben. Zum Beispiel
Diese beiden Karten haben denselben Typ, aber unterschiedliche Reihenfolge:
%Vor% Dies ist nicht unbedingt ein Grund für die Verwendung von <
etc, aber ein guter Grund, Compare
nicht zu verwenden.
Compare
dient zum Vergleich von key_type
. Der Operator <
der Karte vergleicht tatsächlich mapped_type
value_type
, nicht key_type
, also wäre Compare
nicht anwendbar. value_type
ist das Paar key_type
und mapped_type
.
Um ehrlich zu sein, denke ich, dass das Angeben einer Karte an operator<
in erster Linie ein Fall ist, in dem die Bedienerüberlastung zu weit gegangen ist. Es ist nicht sofort offensichtlich, was bedeutet, eine Karte zu sagen ist "weniger als" eine andere. Wenn Sie lexigraphical_compare
möchten, würde ich empfehlen, sie direkt aufzurufen oder zumindest in Ihrem Code zu dokumentieren, was Ihr Kartenvergleich bedeutet.