У меня уже имеется 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);
Комментариев нет:
Отправить комментарий