std::to_string без создания новой строки

243
04 сентября 2018, 23:50

У меня уже имеется std::string str, у которой str.capacity() >= 1024(т.е строчка пустая, но память уже выделена).
Мне нужно дописать в конец этой строчки(str.append(...)) int, double, const char*, long long избежав при этом аллокаций, т.е. чтобы использовалась заранее выделенная память.
Как без танцев с аллокаторами и написанием собственного to_string сделать это?

Answer 1

Идеального решения я тут не вижу, но современный std::string при аккуратном обращении уже позволяет записывать в него данные напрямую. Воспользовавшись "холостым" прогоном std::snprintf можно получить то, что вам нужно

std::string str;
...
int i = 42;
double d = 3.1415;
const char *pc = "Hello World";
long long ll = 123;
size_t length = str.length();
size_t extra_length = std::snprintf(NULL, 0, " %d %lf %s %lld", i, d, pc, ll);
str.resize(length + extra_length + 1);
std::snprintf(str.data() + length, extra_length + 1, " %d %lf %s %lld", i, d, pc, ll);
str.resize(length + extra_length);

Плата за потенциальное отсутствие перевыделения памяти - двойной прогон std::snprintf. Ну и, разумеется, если вы совсем совсем совсем уверены в том, что памяти выделено достаточно, то можно обойтись и без двойного прогона

size_t length = str.length();
str.resize(str.capacity());
size_t extra_length = std::snprintf(str.data() + length, str.length() - length, 
  " %d %lf %s %lld", i, d, pc, ll);
str.resize(length + extra_length);
READ ALSO
cmake, qt и проект разнесенный по каталогам

cmake, qt и проект разнесенный по каталогам

Вопрос вытек из моего предыдущего вопроса: cmake & qt проблемы

272
Пропуск инициализации wstring из-за goto

Пропуск инициализации wstring из-за goto

компилятор выкидывает ошибку что не может инициализировать wc2 из-за метки mmCleanДа, знаю что goto использовать не стоит, но в моем случае он используется...

245
Помогите решить ошибку с interface android

Помогите решить ошибку с interface android

У меня есть приложение в котором я пытаюсь реализовать функцию логина при помощи логина и пароля, и вот у меня возникла ошибка

287