std :: atoll с VC ++ - PullRequest
       50

std :: atoll с VC ++

10 голосов
/ 07 июля 2011

Я использовал std::atoll из cstdlib для преобразования строки в int64_t с помощью gcc. Эта функция, по-видимому, недоступна в наборе инструментов Windows (с использованием Visual Studio Express 2010). Какая лучшая альтернатива?

Я также заинтересован в преобразовании strings в uint64_t. Целочисленные определения взяты из cstdint.

Ответы [ 5 ]

8 голосов
/ 07 июля 2011

MSVC имеет _atoi64 и аналогичные функции, см. здесь

Для 64-разрядных типов без знака см. _strtoui64

5 голосов
/ 07 июля 2011
  • использовать строковые потоки (<sstream>)

    std::string numStr = "12344444423223";
    std::istringstream iss(numStr);
    long long num;
    iss>>num;
    
  • использовать повышение lexical_cast (boost/lexical_cast.hpp)

     std::string numStr = "12344444423223";
     long long num = boost::lexical_cast<long long>(numStr);
    
2 голосов
/ 07 июля 2011

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

long long convert(const char* s)
{
    long long ret = 0;
    while(s != NULL)
    {
       ret*=10; //you can get perverted and write ret = (ret << 3) + (ret << 1) 
       ret += *s++ - '0';
    }
    return ret;
}
1 голос
/ 25 сентября 2014

Visual Studio 2013, наконец, имеет std::atoll.

1 голос
/ 07 июля 2011

У вас есть strtoull в вашем <cstdlib>?Это С99.И C ++ 0x также должен иметь stoull для работы непосредственно со строками.

...