Warum C++ STL-Container verwenden "kleiner als" - operator "< " und nicht "gleich ist gleich" operator== als Komparator?
Während der Durchführung eines Komparators Betreiber innerhalb einer benutzerdefinierten Klasse std::map
kam ich über diese Frage und konnte nicht sehen, überall gefragt.
Abgesehen von der obigen Frage, ist auch daran interessiert zu wissen, in kurzen, wie operator<
würde für std::map
.
Ursprung der Frage:
struct Address {
long m_IPv4Address;
bool isTCP;
bool operator< (const Address&) const; //trouble
};
- Wenn
!(a < b) && !(b < a)
dann(a == b)
. - wenn Sie wissen, wie zu vergleichen mit
<
dann alles andere erzeugt werden kann. check hier - Nicht unbedingt. Sie sind gleichwertig mit Bezug auf die Bestellung, aber nur gleich, wenn die definition von
operator==
stimmt. - Gut, ja. Aber das ist, was bestellt containesr verwenden, Nein?
- Sie verwenden die Gleichwertigkeit, nicht Gleichheit. Die beiden Konzepte nicht notwendigerweise die gleiche Sache.
- Ich bin nicht einverstanden, dass verlinkten post nicht Antworten, die Antwort die OP ' s Frage
Du musst angemeldet sein, um einen Kommentar abzugeben.
std::map<K,D>
muss in der Lage sein zu Sortieren. Standardmäßig verwendetstd::less<K>
, die für nicht-Zeiger verwendet<
1.Mit der Regel, dass Sie fordern, die wenigsten können von Ihren Nutzern, synthetisiert es "Gleichwertigkeit" von
<
wenn es Sie braucht (!(a<b) && !(b<a)
bedeuteta
undb
gleichwertig sind, das heißt, weder ist kleiner als die andere).Dies macht es einfacher zu schreiben, die Klassen zu verwenden, als wichtige Komponenten für eine
map
, das scheint wie eine gute Idee.Gibt es
std
- Containern,==
wiestd::unordered_map
verwendetstd::hash
und==
. Wieder, Sie sind so konzipiert, dass Sie die wenigsten Ihrer Nutzer-Sie brauchen nicht die volle Bestellung fürunordered_
Container, nur äquivalenz und eine gutehash
.Als es passiert, ist es wirklich einfach zu schreiben
<
wenn Sie Zugang zu<tuple>
.verwendet
std::tie
definiert in<tuple>
zu generieren eine richtige<
für Sie.std::tie
nimmt eine Reihe von Daten, und generiert einetuple
von Referenzen, die eine gute<
bereits definiert.1 Für Zeiger, verwendet er einen Vergleich, der kompatibel mit
<
wo<
Verhalten angegeben ist, und benimmt sich gut, wenn<
nicht. Dies nur wirklich zählt, auf dem segmentierten Speicher-Modell und anderen obskuren Architekturen.Weil
std::map
ist ein sortiert assoziative container, es ist Schlüssel benötigen, bestellen.Einer
==
Betreiber nicht um mehrere SchlüsselVielleicht suchen Sie nach
std::unordered_map
, die Arbeit hat eine hashtable. Sie können Ihre eigenen hash-und Gleichheits-operator-Funktionen :unordered_map
?Mit
<
können Sie, um Elemente. Wenna < b
danna
platziert werden soll, bevorb
in der Sammlung.Können Sie auch bestimmen, ob zwei Objekte äquivalent sind: wenn
!(a < b) && !(b < a)
(wenn kein Objekt ist kleiner als das andere), dann sind Sie äquivalent.Diese beiden Möglichkeiten werden alle
std::map
erfordert. So ist es nur erwartet, dass seine element-Typ um eine operator<
.Mit
==
Sie könnten bestimmen der Geschlechter, aber Sie würden nicht in der Lage sein, um Elemente. So würde es nicht genügen den Anforderungen derstd::map
.