stoi dev definicion convertir atol c++ atoi

c++ - dev - equivalente de atoi



stoi c++ (6)

No dices por qué atoi no es adecuado, así que supongo que tiene algo que ver con el rendimiento. De todos modos, la aclaración sería útil.

Usar Boost Spirit.Qi es aproximadamente un orden de magnitud más rápido que atoi , al menos en las pruebas realizadas por Alex Ott .

No tengo una referencia, pero la última vez que lo probé, Boost lexical_cast era aproximadamente un orden de magnitud más lento que atoi . Creo que la razón es que construye un stringstream, que es bastante caro.

Actualización : Algunas pruebas más recientes

¿Hay una función que podría reemplazar atoi en c ++. Hice una investigación y no encontré nada para reemplazarlo, las únicas soluciones serían usar cstdlib o implementarlo yo mismo.


Puede usar la función Boost boost :: lexical_cast <> de la siguiente manera:

char* numericString = "911"; int num = boost::lexical_cast<int>( numericString );

Más información se puede encontrar boost::lexical_cast (última versión 1.47 de Boost). Recuerde manejar adecuadamente las excepciones.


Puedes usar la función std::stoi

#include <string> // Need to include the <string> library to use stoi int mani(){ std::string s = "10"; int n = stoi(s); }

Para compilar realmente esto, tendrá que habilitar c ++ 11, busque en google cómo hacerlo (en code :: blocks es: Settings -> Compiler -> "Have g ++ siga el estándar de lenguaje C ++ 11 ISO C ++") Si compilas desde la terminal tienes que agregar -std = c ++ 11

g++ -std=c++11 -o program program.cpp


Si no desea utilizar Boost, C ++ 11 agregó std::stoi para cadenas. Existen métodos similares para todos los tipos.

std::string s = "123" int num = std::stoi(s);

A diferencia de atoi , si no se puede realizar una invalid_argument se lanza una excepción de invalid_argument . Además, si el valor está fuera de rango para un int, se out_of_range una excepción out_of_range .


Sin impulso:
stringstream ss(my_string_with_a_number); int my_res; ss >> my_res;
Tan molesto como la versión boost pero sin la dependencia adicional. Posiblemente podría perder más ram.


boost::lexical_cast es tu amigo

#include <string> #include <boost/lexical_cast.hpp> int main() { std::string s = "123"; try { int i = boost::lexical_cast<int>(s); //i == 123 } catch(const boost::bad_lexical_cast&) { //incorrect format } }