Это - глупое поручение. Слишком много исключений, чтобы быть в состоянии сделать это детерминировано. Если бы Вы делали это, чтобы предварительно обработать список для дальнейшего рассмотрения, то я утвердил бы, что меньше, конечно, было бы больше.
Дальнейшая обработка, как почти гарантируют, создаст больше работы, поскольку необходимо пройти переобъединение что раскол обработки.
std :: string
имеет функцию resize
, которую вы могли бы использовать, или конструктор, который будет делать то же самое:
boost::uint16_t len;
is.read((char*)&len, 2);
std::string str(len, '\0');
is.read(&str[0], len);
Это не проверено, и я не знаю, обязано ли строкам иметь непрерывное хранилище.
Вы можете использовать что-то вроде getline:
#include <iostream>
#include <string>
using namespace std;
int main () {
string str;
getline (cin,str,' ');
}
I would use a vector as the buffer.
boost::uint16_t len;
is.read((char*)&len, 2); // Note if this file was saved from a different architecture
// then endianness of these two bytes may be reversed.
std::vector buffer(len); // uninitialized.
is.read(&buffer[0], len);
std::string str(buffer.begin(),buffer.end());
Though you will probably get away with using a string as the buffer (as described by GMan). It is not guaranteed by the standard that a strings members are in consecutive locations (so check your current implementation and put a big comment that it needs checking when porting to another compiler/platform).
Вы просто оптимизируете длину кода или пытаетесь сохранить здесь копию? Что не так с временным буфером?
Я бы сказал, что вы на самом деле обходите защиту строки, пытаясь писать напрямую, сделайте это вот так. Если вас беспокоит производительность копирования в std :: string, потому что вы определили, что это каким-то образом влияет на производительность вашего приложения, я бы работал напрямую с char *.
РЕДАКТИРОВАТЬ: Делать больше Ищу... инициализация std :: string из char * без копирования
Во втором ответе довольно четко сказано, что вы не можете достичь того, чего хотите достичь (т.е. заполнить std :: string без итерации над символом * для копирования.)
Взгляните на свою процедуру загрузки (возможно, разместите ее здесь?) и минимизируйте выделение: new и delete, безусловно, не бесплатны, так что вы можете хотя бы сэкономить время, если вы этого не сделаете придется постоянно воссоздавать буфер. Я всегда считаю полезным стереть его, установив для буфера значение 0 или нулевое завершение первого индекса массива на каждой итерации, но вы можете быстро удалить этот код в интересах производительности, когда будете уверены в своем алгоритме.