Страницы

Поиск по вопросам

суббота, 6 июля 2019 г.

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

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


Ответ

Идеального решения я тут не вижу, но современный 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);

Комментариев нет:

Отправить комментарий