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
}
}