2011-07-07 11 views
9

He estado usando std::atoll de cstdlib para convertir una cadena a int64_t con gcc. Esa función no parece estar disponible en la cadena de herramientas de Windows (usando Visual Studio Express 2010). ¿Cuál es la mejor alternativa?std :: atoll with VC++

También estoy interesado en la conversión de strings en uint64_t. Definiciones enteras tomadas de cstdint.

+0

Parece que este problema está solucionado en VS2013 http://connect.microsoft.com/VisualStudio/feedback/details/752386/std-atoll-not-found – javapowered

Respuesta

8

MSVC tienen _atoi64 y funciones similares, ver here

Para los tipos de 64 bits sin signo, véase _strtoui64

+0

Saludos, gracias. – Cookie

+0

Para cualquier otra persona, como referencia, esto no parece tener un equivalente para uint64_t, cambié a trabajar con int64_t (fundiéndolo desde una biblioteca de terceros) – Cookie

+0

@Cookie, agregué un enlace a funciones similares para tipos de 64 bits sin firmar – nos

5
  • stringstreams uso (<sstream>)

    std::string numStr = "12344444423223"; 
    std::istringstream iss(numStr); 
    long long num; 
    iss>>num; 
    
  • uso impulso lexical_cast (boost/lexical_cast.hpp)

    std::string numStr = "12344444423223"; 
    long long num = boost::lexical_cast<long long>(numStr); 
    
+0

Prefiero no hacerlo por motivos de rendimiento – Cookie

+5

@Cookie: Usted ¿Has realizado una prueba de rendimiento y descubres que convertir tu cadena en un número es tu cuello de botella? –

+0

valgrind me dice que, por ejemplo, strtod es 8% del tiempo total. atol está un poco rezagado con 4%. En realidad estoy reescribiendo strtod para deshacerme de esos 8%. los hilos de cadena son considerablemente más lentos que el atol. y lexical_cast es el más lento. La mayor parte del tiempo se gasta en analizar unos 100 megas csv. – Cookie

2

Si ha ejecutado una prueba de rendimiento y concluyó que la conversión es su cuello de botella y debe hacerse realmente rápido, y no hay una función lista, sugiero usted escribe el suyo aquí hay una muestra que funciona muy rápido pero no tiene errores de comprobación y solo trata con números positivos.

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; 
} 
+0

Gracias Armen, es posible que sí. Es muy similar a http://stackoverflow.com/questions/5830868/c-stringstream-is-too-slow-how-to-speed-up for doubles. – Cookie

1

¿Tiene strtoull disponibles en su <cstdlib>? Es C99. Y C++ 0x también debería tener stoull para trabajar directamente en cadenas.

+0

Lamentablemente, MSVC no es compatible con C99. – nos

1

Visual Studio 2013 tiene por fin std::atoll.

Cuestiones relacionadas