Warum sollte std :: less als Standardfunktion zum Vergleichen von Schlüsseln in std :: map und std :: set verwendet werden?
Ich frage mich warumstd::map
undstd::set
verwendenstd::less
als Standardfunktion zum Vergleichen von Schlüsseln. Warum nicht einen Funktor verwenden, der ähnlich wie strcmp funktioniert? So etwas wie:
template <typename T> struct compare
{
// Return less than 0 if lhs < rhs
// Return 0 if lhs == rhs
// Return greater than 0 if lhs > rhs
int operator()(T const& lhs, T const& rhs)
{
return (lhs-rhs);
}
}
Sag amap
hat zwei Objekte mit Schlüsselnkey1
undkey2
. Nun wollen wir ein weiteres Objekt mit Schlüssel einfügenkey3
.
Beim Benutzenstd::less
, dasinsert
Funktion muss zuerst aufgerufen werdenstd::less::operator()
mitkey1
undkey3
. Annehmenstd::less::operator()(key1, key3)
gibt false zurück. Es muss anrufenstd::less::operator()
wieder mit den Tasten geschaltet,std::less::operator()(key3, key1)
, um zu entscheiden, obkey1
entsprichtkey3
oderkey3
ist größer alskey1
. Es gibt zwei Anrufe zustd::less::operator()
eine Entscheidung treffen, wenn der erste Aufruf falsch zurückgibt.
Hättenstd::map::insert
benutztcompare
würde es genügend Informationen geben, um mit nur einem Anruf die richtige Entscheidung zu treffen.
Abhängig von der Art des Schlüssels in der Karte,std::less::operator()(key1, key2)
könnte teuer sein.
Es sei denn, ich vermisse etwas sehr Grundlegendes, sollte nichtstd::map
undstd::set
benutze so etwas wiecompare
Anstatt vonstd::less
als Standardfunktion zum Vergleichen von Schlüsseln?