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 ответа

Решение

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

"Это называется _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)
Другие вопросы по тегам