Wie kann ich 'std :: string' in 'std :: vectorunsigned char' umwandeln, ohne eine Kopie zu erstellen?

7

Es gibt eine Bibliotheksfunktion, die ich aufrufen möchte, deren Signatur lautet:

%Vor%

Ich habe eine std::string Variable, ich möchte diese Funktion als Argument senden.

%Vor%

Gibt es eine Möglichkeit, die Variable std::string direkt zu senden, ohne eine Kopie davon zu erstellen?

    
hkBattousai 16.05.2013, 19:21
quelle

4 Antworten

1

Es steht Ihnen natürlich frei, sich durchzuhacken, um das gewünschte Ergebnis zu erzielen. Aber Sie sollten sich auf eine summarische Ausführung durch Mitarbeiter oder Personen vorbereiten, die Ihren Code verwenden / pflegen / ändern oder portieren möchten ...

... mach es nicht! ...

%Vor%

Druckt

%Vor%

Hinweis:

Wie in den Kommentaren richtig erwähnt, basiert diese Lösung darauf, dass der Vektor das folgende Datenlayout hat und dass die Zeichenfolge ihre Daten zusammenhängend speichern muss (nicht, ob dies durch den Standard vorgegeben ist).

%Vor%     
Pixelchemist 16.05.2013, 19:58
quelle
11

Es gibt keine Möglichkeit, dies zu tun, weil die Layouts der beiden Typen nicht in jeder Hinsicht ähnlich sind.

Der beste Ansatz besteht darin, WriteBinary so zu reparieren, dass stattdessen "iterators" verwendet wird:

%Vor%

Oder Vorlage es:

%Vor%

Und dann kannst du es für Strings, Vektoren oder jeden anderen Container verwenden, den du magst!

Andernfalls können Sie den Iterator-Konstruktor verwenden, um die Kopie so effizient wie möglich zu erstellen:

%Vor%     
Mark B 16.05.2013 19:28
quelle
5

Ich fürchte, das ist nicht möglich. Weder string noch vector haben einen Konstruktor, der es erlauben würde, einen bereits vorhandenen Puffer zu übernehmen. Und es ist sehr wahrscheinlich, dass sich das Speicherlayout von string und vector unterscheidet, daher ist kein Casting möglich.

    
Angew 16.05.2013 19:23
quelle
2
  

Gibt es eine Möglichkeit, die Variable std :: string direkt zu senden   eine Kopie davon machen?

Nein, sicher nicht sicher.

Wenn Sie die Kontrolle über die Bibliothek haben, würde ich einen kleinen Refactor vorschlagen.

Entweder hinzufügen:

%Vor%

Oder:

%Vor%

Und dann machen Sie Ihre bestehenden WriteBinary und WriteString rufen Sie es:

%Vor%

Oder:

%Vor%

Ich persönlich würde den iteratorbasierten Ansatz bevorzugen. Es fühlt sich "sauberer" an.

(Hinweis: Für den Ansatz mit Zeiger / Größe möchten Sie wahrscheinlich auf "leer" prüfen. Einige Implementierungen werden möglicherweise aktiviert, wenn Sie das Ergebnis von begin() für einen leeren Vektor / String ablehnen.)

    
Nathan Ernst 16.05.2013 19:43
quelle

Tags und Links