Anonymous
вот
Constantine
да, я про это видео
Constantine
про git это явно проблемы какого-то школьника были
Constantine
> мне надо перевести uintmax_t в wstring (locale-independent способом) > набросайте плиз код на ISO C++ собственно такой вопрос нужно авторам стандарта отправить, имхо
Constantine
язык программирования общего назначения в 2017 году не содержит штатного и хоть немного близкого к нему способа это сделать
Constantine
перевести число в строку
Constantine
эту функцию поддерживал турбо паскаль
Anatoly
wstring w{s.begin(), s.end()};
Constantine
а как получить string?
Constantine
через snprintf / sprintf?
Constantine
сколько там, шесть операторов языка?
Anatoly
to_string
Anonymous
to_string не катит разве
Constantine
to_string локаль-зависимый
it-trend
перевести число в строку
есть же строковые потоки ))
Constantine
например, может 1000 как 1 000 записать
Constantine
или арабскими цифрами
Anonymous
ну запиши в строковой поток число, форсировав дефолтную локаль (точно не знаю, как это правильно делается)
Anonymous
std::locale imbue( const std::locale& loc );
Constantine
ну запиши в строковой поток число, форсировав дефолтную локаль (точно не знаю, как это правильно делается)
то есть в конфе pro.cxx есть люди, которые не знают на память, как в С++ переводить число в строку? :)
Constantine
это очень забавно, не находите?
Anonymous
я забыл название метода для потока
Constantine
мне кажется, что получится не меньше 7 строк в любом случае
Anonymous
std::wstring to_wstring(uintmax_t i, std::locale locale = std::locale("C")) { std::wstringstream wss; wss.imbue(locale); wss << i; return wss.str(); }
Anonymous
наверн как-то так
Anonymous
а теперь давайте пропосал, чтобы добавить to_wstring, а к to_string добавить параметр locale
Anonymous
гм, ладно
Constantine
https://godbolt.org/g/2gDZCj
Anonymous
но locale, раз to_string локаль-зависимый надо бы
Constantine
96 ассемблерных инструкций, аллокатор памяти
Constantine
вызовы виртуальных функций
Constantine
ява будет быстрее работать, вот серьезно
Constantine
еще и noexcept нет и, видимо, не придвидится
Constantine
а, еще многопоточные запросы блокировки должны быть
Constantine
атомарные операции почти наверняка есть
Constantine
мне кажется, что ручками цикл с делением на 10 будет быстрее работать
Constantine
std::wstring result; for (; i != 0; i /= 10) result += static_cast<wchar_t>(i % 10 + L'0'); std::reverse(result.begin(), result.end());
Constantine
еще 0 проверить
Anatoly
да, если уж нужна скорость я бы не поленился и исключил и аллокацию и реверс :) wchar_t* to_wstring(wchar_t w[], size_t n, uintmax_t u) { auto *e = w + n; auto *b = e; for (; u; u /= 10) { *--b = L'0' + (u % 10); } return b; } int main() { wchar_t b[std::numeric_limits<uintmax_t>::digits10] = { 0 }; std::wcout << (b, sizeof(b) / sizeof(b[0]), std::numeric_limits<uintmax_t>::max()) << std::endl; std::wcout << std::numeric_limits<uintmax_t>::max() << std::endl; }
Constantine
digits10 мало
Constantine
digits10 для int8_t это 2
Anatoly
для uintmax_t 19 на моей машине
Constantine
угу
Constantine
а для int8_t это 2 :)
Constantine
размер буфера с учетом '\0' будет digits10 + 2 для uintmax_t и + 3 для intmax_t
Anatoly
кстати, ты не знаешь почему std::numeric_limits<uintmax_t>:max_digits10 не определен для uintmax_t?
Constantine
знаю
Constantine
потому что max_digits10 это вообще не то
Constantine
это что-то там про вещественные числа
Constantine
а digits10 это (внимание!) максимальная длина такая, что число такой длины гарантированно представимо в типе
Constantine
т.е. если тип [0; 255] то digits10 будет 2
Constantine
потому что 300 длины 3 не представимо в типе
Anatoly
ладно, все равно голова не работает, пошел спать
Ioann_
ява будет быстрее работать, вот серьезно
А почему тебе руками не написать б ?
Constantine
А почему тебе руками не написать б ?
Руками писать перевод числа в строку?
Ioann_
Ну, а это сильно странно ?
Ioann_
Все таки не double
Constantine
Вообще-то говоря да
Constantine
Как вы думаете, с какой частотой в коде встречается перевод строки в число и числа в строку?
Constantine
В gui это постоянно
В gui другой вывод
Constantine
там локаль-зависимость как раз
Anton
В gui другой вывод
Хорошо. Чтение логов с датой и временем. Но да, тут тоже local-dep
Constantine
да запись XML/JSON любого формата
Constantine
любой вывод лога
Ioann_
там локаль-зависимость как раз
А сишечка не могет в то что тебе нужно ?
Ioann_
Я не утверждал как. Просто если у тебя int можно же пере.... но придется выделять память самому и так далее
Stanislav
кстати в пропозале на to_chars встречается упоминание string_view я так и не понял че не сделали с ним
Ioann_
Ну я про проблемы с размером и говорю.
Constantine
std::numeric_limits<uintmax_t>::digits10() + 2 просто шикарно
Ioann_
Но обычно не больше чем 32
Constantine
:)
Constantine
640K ought to be enough to everyone
Constantine
int128_t не влезет в 32
Ioann_
Ну в тех же строках она и так с запасом выделяется.
Constantine
т.е. если платформа поддерживает int128_t, у меня buffer overrun на запись