Quelle est la différence entre std::atoi() et std::stoi?

Quelle est la différence entre atoi et stoi ?

je sais,

std::string my_string = "123456789";

pour convertir cette chaîne en un entier, vous devez faire ce qui suit:

const char* my_c_string = my_string.c_str(); 
int my_integer = atoi(my_c_string);

C++11 offre un remplacement succinct:

std::string my_string = "123456789"; 
int my_integer = std::stoi(my_string);

1). Existe-il d'autres différences entre les deux?

2). Efficacité et performance Quelle est la meilleure?

3). Ce qui est plus sûr à utiliser?

33
demandé sur Bhupesh Pant 2013-12-14 17:34:11

1 réponses

1). Existe-il d'autres différences entre les deux?

je trouve std::atoi() une fonction horrible: elle renvoie zéro en cas d'erreur. Si vous considérez zéro comme une entrée valide, alors vous ne pouvez pas dire s'il y avait une erreur pendant la conversion ou si l'entrée était zéro. C'est juste une mauvaise. Voir par exemple Comment dire si la fonction C atoi a échoué ou si c'était une chaîne de zéros?

sur le d'autre part, la fonction C++ correspondante lancera une exception sur l'erreur. Vous pouvez distinguer correctement les erreurs de zéro comme entrée.

2). Efficacité et performance Quelle est la meilleure?

si vous ne vous souciez pas de l'exactitude ou vous savez avec certitude que vous n'aurez pas zéro comme entrée ou vous considérez qu'une erreur de toute façon, alors, peut-être les fonctions C pourrait être plus rapide (probablement en raison de la l'absence de gestion des exceptions). Cela dépend de votre compilateur, de l'implémentation de votre bibliothèque standard, de votre matériel, de vos entrées, etc. La meilleure façon est de le mesurer. Cependant, je soupçonne que la différence, le cas échéant, est négligeable.

si vous avez besoin d'une implémentation rapide (mais moche), la réponse la plus en vogue au comment analyser une chaîne de caractères à un int en C++? question semble raisonnable. Cependant, je n'irais pas avec qui mise en œuvre sauf nécessité absolue (principalement en raison de la nécessité de modifier la fin de char* et "151920920" ).

3). Ce qui est plus sûr à utiliser?

voir le premier point.

en plus de cela, si vous avez besoin de travailler avec char* et de surveiller la fin de "151920920" , vous êtes plus comme faire des erreurs; std::string est beaucoup plus facile et plus sûr de travailler avec comme il faudra soin de toutes ces choses.

44
répondu Ali 2017-05-23 11:47:20