Anonymous
вот
Constantine
да, я про это видео
Constantine
про git это явно проблемы какого-то школьника были
Constantine
> мне надо перевести uintmax_t в wstring (locale-independent способом)
> набросайте плиз код на ISO C++
собственно такой вопрос нужно авторам стандарта отправить, имхо
Constantine
язык программирования общего назначения в 2017 году не содержит штатного и хоть немного близкого к нему способа это сделать
Constantine
перевести число в строку
Constantine
эту функцию поддерживал турбо паскаль
Anatoly
Anatoly
wstring w{s.begin(), s.end()};
Constantine
а как получить string?
Constantine
через snprintf / sprintf?
Constantine
сколько там, шесть операторов языка?
Anatoly
to_string
Anonymous
to_string не катит разве
Constantine
to_string локаль-зависимый
Constantine
например, может 1000 как 1 000 записать
Constantine
или арабскими цифрами
Anonymous
ну запиши в строковой поток число, форсировав дефолтную локаль (точно не знаю, как это правильно делается)
Anonymous
std::locale imbue( const std::locale& loc );
Constantine
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
Stanislav
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_
Ioann_
Ну, а это сильно странно ?
Ioann_
Все таки не double
Constantine
Вообще-то говоря да
Constantine
Как вы думаете, с какой частотой в коде встречается перевод строки в число и числа в строку?
Anton
Constantine
там локаль-зависимость как раз
Anton
В gui другой вывод
Хорошо. Чтение логов с датой и временем. Но да, тут тоже local-dep
Constantine
да запись XML/JSON любого формата
Constantine
любой вывод лога
Constantine
Ioann_
Я не утверждал как. Просто если у тебя int можно же пере.... но придется выделять память самому и так далее
Stanislav
кстати в пропозале на to_chars встречается упоминание string_view я так и не понял че не сделали с ним
Constantine
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 на запись