std::set mit compare
-
Wenn ich mir nen eigenen Datentypen definiere und diesen dann in einem std::set verwenden will. Und mir eine eigene compare methode für den Datentyp schreibe
struct MyDatatype { std::string Name; int Value }; struct NameCompare { template <typename T> bool operator()(T&& lhs, const MyDatatype& rhs) const { return std::forward<T>(lhs) < rhs->Name; } template <typename T> bool operator()(const MyDatatype& rhs, T&& y) const { return rhs->Name < std::forward<T>(y); } bool operator()(const MyDatatype& lhs, const MyDatatype& rhs) const { return lhs->Name < rhs->Name; } using is_transparent = int; }; int main() { std::set<MyDatatype, NameCompare> myset; // ... }
Ist es dann besser aufgrund der sichtbarkeit die Namecompare struktur in den scope von MyDatatype zu packen.
Oder doch besser ausserhalb um den Datentypen so klein wie möglich zu halten?
-
Die Größe von
NameCompare
hat nichts mit der Größe vonMyDatatype
zu tun. Nebenbei,NameCompare
ist 0 Bytes groß ...
-
@Swordfish sagte in std::set mit compare:
NameCompare ist 0 Bytes groß ...
achso stimmt. using is_transparent = int;
ist ja kein member. habe ich übersehen.@Swordfish sagte in std::set mit compare:
Die Größe von NameCompare hat nichts mit der Größe von MyDatatype zu tun.
Ist das unabhängig davon wie groß eine Klasse/Struktur innerhalb einer anderen Struktur/Klasse ist?Sprich wenn NameCompare nun noch ein paar Member hätte und nicht 0 Bytes groß wäre.
-
@booster sagte in std::set mit compare:
Sprich wenn NameCompare nun noch ein paar Member hätte und nicht 0 Bytes groß wäre.
Dann hat
NameCompare
trotzdem keinen einfluss auf die Größe vonMyDatatype
und einstd::set<MyDatatype, NameCompare>
wird `NameCompare nur dann instanziieren wenn es gebraucht wird.
-
Danke Swordfish.
Gibt es da vieleicht eine gute Seite wo man so was (Größe einer Klasse /Struktur ) nachlesen kann.
-
Da der Standard keine Größen für Standardcontainer vorschreibt ... nein. Was hindert dich an
sizeof foo;
?
-
nichts hindert mich. Aber bevor ich nun überall teste hätte es ja sein können dass ich das irgendwo nachlesen kann.
Danke.