Wie die Umsetzung in C++ (un -) Gleichheit Operatoren für Aggregat-Strukturen?
Manchmal habe ich Strukturen wie diese --
struct aggregate1 {
std::string name;
std::vector<ValueT> options;
size_t foobar;
//...
};
-- wo (un -) Gleichheit ist einfach definiert als (un -) Gleichheit aller Mitglieder: lhs_name == rhs_name && lhs_options == rhs_options && lhs_foobar == rhs_foobar
.
Was ist der "beste" Weg, um dies zu implementieren? (Am besten wie in: (Laufzeit-)Effizienz, Wartbarkeit, Lesbarkeit)
operator==
im Hinblick aufoperator!=
operator!=
im Hinblick aufoperator==
- Separate Implementierungen für
==
und!=
- Als Mitglied oder als freie Funktionen?
Beachten Sie, dass diese Frage nur über die (un -) Gleichheit ops, wie der Vergleich (<
, <=
, ...) nicht viel Sinn zu machen für solche Aggregate.
InformationsquelleAutor Martin Ba | 2011-02-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Member oder free-Funktion ist eine Frage des Geschmacks, und schreiben getrennte Implementierungen von
==
und!=
scheint mir langweilig, fehleranfällig (man vergisst ein Mitglied in nur einem der beiden Betreiber, und es wird einige Zeit dauern, um zu bemerken), ohne etwas in Bezug auf die Effizienz (das aufrufen der anderen Betreiber und anwenden!
hat einen vernachlässigbaren Kosten).Die Entscheidung beschränkt sich auf "ist es besser zu implementieren
operator==
im Hinblick aufoperator!=
oder das Gegenteil?Meiner Meinung nach, in Bezug auf die Wartbarkeit/Lesbarkeit/Effizienz es ist das gleiche; ich würde nur empfehlen, es zu tun in der gleichen Weise überall für den sack von der Konsistenz. Der einzige Fall, wo Sie wollen lieber eine oder die andere als die "Basis-Vermittlung" ist, wenn Sie wissen, dass die Typen, die in Ihrer Struktur, die von einem Betreiber ist schneller als seine negation, aber ich weiß nicht, Wann dies geschehen könnte.
InformationsquelleAutor Matteo Italia
Ich würde dies tun, aber vielleicht bewegen operator== definition cpp-Datei. Lassen Sie operator!= zu inline -
Erinnern, zu vergleichen, member-Variablen, die am ehesten unterscheiden sich ersten so der rest sind kurzgeschlossen und die Leistung ist besser.
InformationsquelleAutor T33C
IMHO, implementieren, wie Freunde und Umsetzung der
operator==
(STL-algorithmen werden verlassen Sie sich auf diesen zum Beispiel) und dieoperator!=
umgesetzt werden sollte, als die negation des ist-gleich-operator.InformationsquelleAutor Nim
(-: Selbst beantworten 🙂
Ich möchte hervorheben, dass ein Aspekt der Aggregate WRT Effizienz:
Die Reihenfolge der Auswertung von
op==
undop!=
ist irrelevant für die (Durchschnittliche) Leistung.Vorausgesetzt, separate Implementierungen für jetzt und angesichts der beiden Extreme (a-eq) alle Unterelemente gleich und (b-neq) alle Unterelemente inequal, wir haben diese Fälle:
operator==
: Muss vergleichen alle sub-Elemente den Wert true zurückoperator!=
: Muss vergleichen alle sub-Elemente den Wert false zurückoperator==
: Gibt false zurück, nach 1. sub-element ist bestimmt inequaloperator!=
: Gibt true zurück, nach 1. sub-element ist bestimmt inequalDa die Leistung im Durchschnitt ist die gleiche so oder so scheint es -- zumindest für mich -- natürlich weitere Umsetzung
op!=
im Hinblick aufop==
, wie es fühlt sich natürlicher zu mir, zur Umsetzung der Gleichstellung op.InformationsquelleAutor Martin Ba