2012-06-14 5 views
7

Ich versuche cvopy boost::array<char> zu std::string.Kopieren boost :: array <char> zu std :: string

boost::array<char, 1024> _buffer; 
std::string data; 
std::copy(_buffer.begin(), _buffer.begin()+bytes_transferred, data.begin()); 

die nicht funktioniert. Also habe ich es ein bisschen verändert.

char _buffer[1024]; 
std::string data; 
std::copy(_buffer, _buffer+bytes_transferred, data.begin()); 

zweitens funktioniert auch nicht.

+0

Also was genau meinst du mit "nicht funktioniert"? – sth

Antwort

5

Sie können back_insert_iterator verwenden. Zuweisen wird push_back Funktion des zugrunde liegenden Containers, so dass Sie sich nicht sorgen müssen mit Speicherplatz manuell zuweisen.

std::copy(_buffer.begin(), _buffer.begin()+bytes_transferred, std::back_inserter(data)); 
+1

Während das funktioniert, denke ich, es ist viel weniger effizient als nur den Konstruktor zu verwenden. Ich bezweifle, dass der Compiler klug genug ist zu erkennen, dass er dies in eine Blockspeicherkopie optimieren kann. – templatetypedef

+0

@templatetypedef Ich stimme zu. Ich habe das um der Vollständigkeit willen geschrieben, schätze ich. – jrok

15

Das Problem hier ist, dass copy davon ausgeht, dass bereits Platz für die Daten vorhanden ist, die Sie schreiben; es schafft keinen neuen Raum für Sie. Daher verursachen beide oben genannten Codeteile undefiniertes Verhalten, da Sie Zeichen an einen Speicherort kopieren werden, an dem Speicherplatz nicht zuvor reserviert wurde.

Der beste Weg, dies zu tun, um das string Konstruktor zu verwenden wäre:

boost::array<char, 1024> _buffer; 
std::string data(_buffer.begin(), _buffer.end()); 

oder

char _buffer[1024]; 
std::string data(_buffer, _buffer + 1024); 

Dies wird initialisiert die Zeichenfolge als eine Kopie der Daten in dem Array gespeichert.

Hoffe, das hilft!

+0

Also muss ich 'reservieren()' Wenn ich 'std :: copy' verwenden möchte? und warum stürzt 'std :: copy' nicht ab? –

+3

@ DiproSen- Nein, 'reserve' wird das nicht beheben. Sie müssten die Zeichenfolge "resize", so dass genügend Platz vor der Verwendung von 'std :: copy' war. 'Reserve' dient einer ganz anderen Funktion. Warum es keinen Absturz gibt, ich habe absolut keine Ahnung. Es ist undefiniertes Verhalten, was bedeutet, dass das Programm alles kann. Kein Absturz ist durch die C++ Spezifikation vollkommen legal. – templatetypedef

Verwandte Themen