64-битное целочисленное преобразование из строки - PullRequest
5 голосов
/ 22 ноября 2011

Я имею дело с проблемой чтения 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 ]

5 голосов
/ 22 ноября 2011

См. http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/d69a6afe-6558-4913-afb0-616f00805229/

"Это называется _strtoui64 (), _wcstoui64 () и _tcstoui64 (). Плюс версии _l для пользовательских локалей.
Пассив Ганса."1007 *

Кстати, путь к таким вещам в Google заключается в том, чтобы заметить, что Google автоматически считает, что вы неправы (как и в более новых версиях Visual Studio), и вместо этого ищет что-то другое, поэтому обязательно нажмите нассылка для поиска того, что вы сказали, чтобы искать.

Cheers & hth.,

2 голосов
/ 22 ноября 2011

Конечно, вы можете достаточно легко написать свою собственную функцию для обработки простых десятичных строк. Стандартные функции обрабатывают различные альтернативы в соответствии с числовой базой и локалью, что делает их медленными в любом случае.

Да, stringstream добавит выделение кучи поверх всего этого. Нет, производительность действительно не имеет значения, пока вы не заметите разницу.

Существует более быстрый вариант - использовать устаревший класс std::strstream, который не владеет своим буфером (следовательно, не делает копию или не выполняет распределение). Я бы не назвал это «лучше».

1 голос
/ 22 ноября 2011

Вы можете анализировать строку из 9 цифр за раз, начиная с задней части и умножая ее на 1 000 000 000 ^ i, т.е. (8 последних цифр * 1) + (следующие 8 цифр * 1 миллиард) ... или

(1000000000000000000)+(234567890000000000)+(123456789)
...