Комментарии 17
Иронично, в статье про форматирование текста куски кода вообще не отформатированы, из-за чего практически нечитаемы (молчу про горизонтальную прокрутку).
А можно все тоже самое, но действительно с форматированием?
Ну, например, когда нужно вывести легко читаемую табличку типа
============ VPN ============
Count : 131184
Fill
Average File : 10.542871
Average Idx : 4.629779
Minimum File : 7.000000
Minimum Idx : 0.000000
Maximum File : 783.000000
Maximum Idx : 2584.000000
SQE File : 5.472801
SQE Idx : 20.577609
Dispersion File: 29.951783
Dispersion Idx : 423.441226
Search
Average File : 7.602459
Average Idx : 3.674952
Minimum File : 0.000000
Minimum Idx : 0.000000
Maximum File : 135.000000
Maximum Idx : 128.000000
SQE File : 2.360294
SQE Idx : 4.086529
Dispersion File: 5.571032
Dispersion Idx : 16.699851
Т.е. дополнение нулями, выравнивание по десятичному разделителю и т.п.
Насколько для таких операций fmt будет лучше/хуже printf? Возможно ли такое через потоки?
Без иронии, сарказма и подвоха. Действительно интересно.
Возможно ли такое через потоки?
https://en.cppreference.com/w/cpp/io/manip/setfill и вообще iomanip
Учитывая что там статичный текст форматируют я думаю там над нормальным кодом автор особо не задумывался, не говоря уже про вывод нормальных результатов.
По-моему чисто с точки зрения чтения идея форматировать операцией двоичного сдвига чудовищная.
Интересно было бы ещё сравнить форматирование с Qt, понятно что это уже сторонняя либа, но всё же.
Это там где "%1 %2 %3 %1" % (1,2,3)
? Так оно ж супер неудобное. Скорость будет на уровне printf, только памяти в некоторых случаях будет тратить несколько больше.
Да, но не только. Там ещё есть
asprintf
vasprintf
QTextStream
ну и arg
Вполне возможно, что это просто обёртки над std со своими доработками. Но вот это как раз и было бы интересно проверить, на сколько медленнее (быстрее) по сравнению с std
Итоговый текст будет иметь вид "address=00000004D4DAE218". Но с std::format этот вариант не сработает
Чтобы сработало, нужно привести аргумент к void* (если я не общаюсь с std, это точно работает с библиотекой fmt):
int a = 42;
std::string text = std::format("address={}", static_cast<void*>(&a));
Попытка проделать то же самое с помощью std::format снова провалится, поскольку эта команда не знает, как форматировать массив:
Автор точно переводчик? Это правильно переводится как «потерпит неудачу».
format вообще на питоновский способ форматирования похож. Не могу сказать о преимуществах объектного подхода. По мне так старый сишный способ вполне себе является рабочим. Вообще С++ изменился по сравнению с тем, что был первым вариантом от Бъёрна Страуструпа. Сейчас это вообще джунгли. Лично у меня последние новации не вызывают восторга. Получается, что это не старый добрый С++, а какой-то JavaScript.
Спасибо, интересно! Однако, предлагаю не обижать std::format_to в сравнении с sprintf: для sprintf буфер аллоцируется заранее, и с той же возможностью преаллоцировать буфер имеет смысл и std::format_to померять тоже. Я из любопытства померял - плюс добавил строчку на 10 миллионов итераций - получается примерно так (новая колонка с преаллоцированным буфером для std::format_to - предпоследняя):
iterations stringstream sprintf format_to fmt_to(2) format
1 14.50 3.20 4.60 0.30 0.40
2 2.55 0.50 0.50 0.30 0.30
5 1.66 0.34 0.30 0.22 0.28
10 1.16 0.26 0.24 0.19 0.21
100 0.86 0.21 0.19 0.16 0.19
1000 0.82 0.20 0.17 0.15 0.18
10000 0.77 0.19 0.16 0.14 0.17
100000 0.74 0.17 0.14 0.13 0.15
1000000 0.77 0.18 0.17 0.14 0.18
10000000 0.74 0.17 0.14 0.13 0.16
Извините за поехавшее форматирование - не знаю, как это можно здесь исправить. Мерял с компилятором msvc, Release, все оптимизации - на скорость.
Код для новой колонки - как для sprintf:std::string str(100, '\0');
std::format_to(str.data(), "Number {} is great!", numbers[i]);
Форматирование текста на C++ старым и новым способом