64-битное целочисленное преобразование из строки
Я имею дело с проблемой чтения 64-битного целого числа без знака unsigned long long
из строки Мой код должен работать как для GCC 4.3, так и для Visual Studio 2010.
Я прочитал этот вопрос и ответы по теме: прочитайте 64-битную целочисленную строку из файла и strtoull
сделает работу просто отлично и более эффективно, чем с помощью std::stringstream
, к несчастью strtoull
недоступно в Visual Studio stdlib.h
,
Поэтому я написал короткую шаблонную функцию:
template <typename T>
T ToNumber(const std::string& Str)
{
T Number;
std::stringstream S(Str);
S >> Number;
return Number;
}
unsigned long long N = ToNumber<unsigned long long>("1234567890123456789");
Я беспокоюсь об эффективности этого решения, поэтому есть ли лучший вариант в этом сценарии?
3 ответа
"Это называется _strtoui64(), _wcstoui64() и _tcstoui64(). Плюс версии _l для пользовательских локалей.
Ганс Пассант."
Между прочим, путь к таким вещам в Google заключается в том, чтобы заметить, что Google автоматически считает, что вы неправы (как и в более новых версиях Visual Studio), и вместо этого ищет что-то другое, поэтому обязательно нажмите на ссылку, чтобы найти то, что нужно. ты сказал это искать.
Ура & hth.,
Конечно, вы можете достаточно легко написать свою собственную функцию для обработки простых десятичных строк. Стандартные функции обрабатывают различные альтернативы в соответствии с числовой базой и локалью, что делает их медленными в любом случае.
Да, stringstream
добавит распределение кучи поверх всего этого. Нет, производительность действительно не имеет значения, пока вы не заметите разницу.
Есть более быстрый вариант, использовать устаревший std::strstream
класс, который не владеет своим буфером (следовательно, не делает копию или не выполняет распределение). Я бы не назвал это "лучше", хотя.
Вы можете проанализировать строку из 9 цифр за раз, начиная с задней части и умножая на 1 000 000 000 ^ i, т.е. (последние 8 цифр * 1) + (следующие 8 цифр * 1 миллиард) ... или
(1000000000000000000)+(234567890000000000)+(123456789)