Von http://www.cplusplus.com/reference/map/map/operators/ Ich bemerkte:Warum std :: map überladener Operator <nicht die
„Beachten Sie, dass keine dieser Operationen berücksichtigt das interne Vergleichsobjekt entweder Behälter, aber die Elemente vergleichen (vom Typ value_type) direkt. "
das ist zu sagen, dass der überladene Operator "<" unterstützt die Compare
in seiner Erklärung nicht mit (siehe http://www.cplusplus.com/reference/map/map/)
std::map
template < class Key, // map::key_type
class T, // map::mapped_type
class Compare = less<Key>, // map::key_compare
class Alloc = allocator<pair<const Key,T> > // map::allocator_type
> class map;
wo die Compare
vergleichen ist: Ein binäre Prädikat, das zwei Elementschlüssel als Argumente nimmt und einen
bool
zurückgibt. Der Ausdruckcomp(a,b)
, wocomp
ist ein Objekt dieser Art unda
undb
sind Schlüsselwerte, so wahr zurück, wenna
ist vorb
im strengen schwach gehen als die Funktion definiert Bestellung. Das Map-Objekt verwendet diesen Ausdruck, um die Reihenfolge zu bestimmen, in der die Elemente im Container folgen, und ob zwei Elemente äquivalent sind (durch einen reflexiven Vergleich: Sie sind äquivalent wenn!comp(a,b) && !comp(b,a))
. Zwei Elemente in einem Map Container können äquivalent sein Schlüssel. Dies kann ein Funktionszeiger oder ein Funktionsobjekt (siehe Konstruktor für ein Beispiel) sein. der Standardwert istless<T>
, die(a<b)
das weniger-als-Operator als Anwenden derselben zurückkehrt. Aliased als Elementtypmap::key_compare
.
Ich nicht ganz unter Stehen Sie, warum nicht einfach Compare
in der "<" -Operator verwenden?
Vielleicht war die Idee, dass '<' <'' verwenden sollte, aber ich würde sicher gerne eine weniger typische Antwort hören. – Angew
(in gcc), nennen sie explizit 'lexikographic_compare', ich sehe nicht, warum sie die Vergleichsfunktion nicht einfach so propagieren, soweit ich sehen kann, es ist verfügbar ... Meine Vermutung wäre, dass die' Compare-Funktion kann beliebig komplex sein, und für diesen Fall ist es nur daran interessiert, ob das Element an der gleichen Stelle gleich ist, also könnte ein einfacheres <
Nim
@Nim vermutlich Wenn sie den 'Compare'-Funktor propagieren, würde das Verhalten von etwas abweichen, das im Standard spezifiziert ist. – juanchopanza