C++ Daten anhand eines char* in unterschiedliche Datein schreiben
-
@wob sagte in C++ Daten anhand eines char* in unterschiedliche Datein schreiben:
Das hat ja mit move oder copy erstmal nichts zu tun. Eine Map enthält std::pairs. Um zu checken, ob ein Element bereits vorhanden ist, brauche ich aber den Key aus dem Pair. Der Key im pair muss also auf auf jeden Fall konstruiert werden. - wie soll denn die Map sonst herausfinden, ob ein Element schon vorhanden ist? Und dann wird wohl eben gleich das ganze pair erzeugt - und eben wieder verworfen, wenn bereits in der Map.
Naja, aber wozu wird denn der Value_Type instanziiert? Es wird eine Instanz von "A" erzeugt, aber dann weder kopiert noch bewegt ( geht ja auch gar nicht ). Dass der Key_type erzeugt wird, ist ja kein Problem und auch nachvollziehbar. Aber wenn es den Key schon gibt, sehe ich keinen Grund warum der Value_type anlegt werden muss.
Hier ist ja auch die Rede von "Inplace"Konstruktion, das klang in meinem Kopf immer nach "wird direkt im Map-Speicher erzeugt, wenn notwendig.
-
@It0101 sagte in C++ Daten anhand eines char* in unterschiedliche Datein schreiben:
Naja, aber wozu wird denn der Value_Type instanziiert? ... Aber wenn es den Key schon gibt, sehe ich keinen Grund warum der Value_type anlegt werden muss.
Dann erzeuge doch mal ein
pair<string, ofstream>
, ohne dass du den ofstream auch erzeugst.
-
@wob sagte in C++ Daten anhand eines char* in unterschiedliche Datein schreiben:
@It0101 sagte in C++ Daten anhand eines char* in unterschiedliche Datein schreiben:
Naja, aber wozu wird denn der Value_Type instanziiert? ... Aber wenn es den Key schon gibt, sehe ich keinen Grund warum der Value_type anlegt werden muss.
Dann erzeuge doch mal ein
pair<string, ofstream>
, ohne dass du den ofstream auch erzeugst.Warum muss denn die Map das Pair überhaupt erzeugen, wenn der Key schon existiert? "Inplace" ist halt für mich was anderes als "ich mach erstmal das pair, egal ob ichs brauch oder nicht"
-
@It0101 sagte in C++ Daten anhand eines char* in unterschiedliche Datein schreiben:
@wob sagte in C++ Daten anhand eines char* in unterschiedliche Datein schreiben:
@It0101 sagte in C++ Daten anhand eines char* in unterschiedliche Datein schreiben:
Naja, aber wozu wird denn der Value_Type instanziiert? ... Aber wenn es den Key schon gibt, sehe ich keinen Grund warum der Value_type anlegt werden muss.
Dann erzeuge doch mal ein
pair<string, ofstream>
, ohne dass du den ofstream auch erzeugst.Warum muss denn die Map das Pair überhaupt erzeugen, wenn der Key schon existiert? "Inplace" ist halt für mich was anderes als "ich mach erstmal das pair, egal ob ichs brauch oder nicht"
Wie willst du sonst den Check machen?
Die Alternative wäre, dass du den Key 2x erzeugst. Einmal für dich zum Vergleichen und wenn nicht gefunden, nochmal für den Wert im Pair.
-
@wob sagte in C++ Daten anhand eines char* in unterschiedliche Datein schreiben:
Die Alternative wäre, dass du den Key 2x erzeugst. Einmal für dich zum Vergleichen und wenn nicht gefunden, nochmal für den Wert im Pair.
Klingt für mich billiger als das ganze Pair zu erzeugen. Ein Key ist ja im allgemeinen "leichtgewichtiger" als der value_type.
-
@It0101 sagte in C++ Daten anhand eines char* in unterschiedliche Datein schreiben:
Klingt für mich billiger als das ganze Pair zu erzeugen.
- kommt darauf an. Vielleicht ist dein Key-Objekt auch groß und teurer zu erstellen als der Value.
- Gerade weil du ja auch move verwenden willst: kannst du den Key überhaupt 2x aus den Daten erstellen? Ggf. willst du ja einen Constructor verwenden, der von den übergebenen Daten movet.
Ist also nicht so einfach.
Was ich mir noch gedacht hatte: ein pair<keytype, char[sizeof valuetype]> zu erzeugen und dann den value per reinterpret_cast & placement-new darin erzeugen, sofern benötigt. Gibt aber bestimmt irgendwelche Gründe, die dagegen sprechen, wahrscheinlich UB oder so
-
Je länger man drüber nachdenkt, desto komplexer wird das Thema. Vermutlich erzeugt man wirklich das Pair und arbeitet dann damit und erzeugt es dann im Nachgang inplace nochmal und kann dadurch auch NonCopyAble und co. sauber verarzten. Aber interessant, dass zumindest die MinGW-implementation von try_emplace die Nummer dann sauber hinbekommt.
Interessant. Also try_emplace bedingt einen kopierbaren Key. Das ist scheinbar der einzige Haken. Emplace kann auch mit NonCopyAble-Keys sauber arbeiten, und hat dafür als Nachteil diesen zusätzlichen Konstruktoraufruf.
Das heißt für die meisten Anwendungsfälle ist try_emplace the way to got, wie mir scheint.
-
@It0101 sagte in C++ Daten anhand eines char* in unterschiedliche Datein schreiben:
und erzeugt es dann im Nachgang inplace nochmal
Hä? Warum würdest du es nochmal erzeugen wollen?
-
@wob sagte in C++ Daten anhand eines char* in unterschiedliche Datein schreiben:
@It0101 sagte in C++ Daten anhand eines char* in unterschiedliche Datein schreiben:
und erzeugt es dann im Nachgang inplace nochmal
Hä? Warum würdest du es nochmal erzeugen wollen?
Weil mein Objekt weder kopierbar noch bewegbar ist.
Edit: ganz offensichtlich hab ich nen Denkfehler, denn der value_type::Konstruktor wird ja bei einem Aufruf von emplace nicht zwei mal aufgerufen.
-
Dieser Beitrag wurde gelöscht!