2012-06-14 13 views
7

Estoy tratando de copiar boost::array<char> a std::string.Aumento de copia :: array <char> a std :: string

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

que no funciona. Así que lo cambié un poco.

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

segundo tampoco funciona.

+0

¿A qué se refieren exactamente por "not working"? – sth

Respuesta

5

Puede usar back_insert_iterator. Asignarlo llamará a la función push_back del contenedor subyacente para que no tenga que preocuparse por asignar espacio manualmente.

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

Mientras esto funciona, creo que es mucho menos eficiente que simplemente usar el constructor. Dudo que el compilador sea lo suficientemente inteligente como para darse cuenta de que puede optimizar esto en una copia de memoria de bloques. – templatetypedef

+0

@templatetypedef Estoy de acuerdo. Lo publiqué por completo, supongo. – jrok

15

El problema aquí es que copy supone que ya existe espacio para los datos que está escribiendo; no crea ninguna habitación nueva para ti. En consecuencia, los dos códigos anteriores provocan un comportamiento indefinido, ya que va a copiar caracteres en una ubicación donde el espacio no se ha reservado previamente.

La mejor manera de hacer esto sería utilizar la string constructor:

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

o

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

Esto iniciará la cadena como una copia de los datos almacenados en la matriz.

Espero que esto ayude!

+0

Entonces, ¿tengo que 'reserve()' Si quiero usar 'std :: copy'? y ¿por qué 'std :: copy' no se bloquea? –

+3

@ DiproSen- No, 'reserve' no arreglará esto. Tendría que 'cambiar el tamaño' de la cadena para que haya espacio suficiente antes de usar' std :: copy'. 'reserve' cumple una función totalmente diferente. En cuanto a por qué no hay choques, no tengo absolutamente ninguna idea. Es un comportamiento indefinido, lo que significa que el programa puede hacer cualquier cosa. No fallar es perfectamente legal según las especificaciones de C++. – templatetypedef