Warum der überladene Operator std :: map den Vergleich nicht verwendet

8

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 Ссылка )

%Vor%

wo Compare ist

  

Vergleichen: Ein binäres Prädikat, das zwei Elementschlüssel als Argumente akzeptiert   und gibt bool zurück. Der Ausdruck comp(a,b) , wobei comp ein Objekt ist   von diesem Typ und a und b sind Schlüsselwerte, sollen true zurückgeben, wenn a ist   betrachtet, um vor b 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 auf    less<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?

    
athos 06.01.2015, 13:57
quelle

2 Antworten

3
  

Warum std::map overloaded operator < nicht Compare

verwendet

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

%Vor%

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.

    
juanchopanza 06.01.2015, 14:48
quelle
4

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.

    
Joel 06.01.2015 14:33
quelle

Tags und Links