web-dev-qa-db-fra.com

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 entier, vous devez procéder comme suit:

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

C++ 11 propose un remplacement succinct:

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

1). Y a-t-il d'autres différences entre les deux?

2). En termes d'efficacité et de performances, laquelle est la meilleure?

3). Quel est le plus sûr à utiliser?

42
Bhupesh Pant

1). Y a-t-il d'autres différences entre les deux?

Je trouve std::atoi() une horrible fonction: elle retourne zéro en cas d'erreur. Si vous considérez zéro comme une entrée valide, vous ne pouvez pas dire s'il y a eu une erreur lors de la conversion ou si l'entrée était nulle. C'est tout simplement mauvais. Voir par exemple Comment savoir si la fonction c atoi a échoué ou s'il s'agissait d'une chaîne de zéros?

D'un autre côté, la fonction C++ correspondante lèvera une exception en cas d'erreur. Vous pouvez distinguer correctement les erreurs de zéro en entrée.

2). En termes d'efficacité et de performances, laquelle est la meilleure?

Si vous ne vous souciez pas de l'exactitude ou si vous savez avec certitude que vous n'aurez pas zéro en entrée ou si vous considérez qu'une erreur de toute façon, alors, les fonctions C pourraient être plus rapide (probablement en raison du manque de gestion des exceptions). Cela dépend de votre compilateur, de votre implémentation de bibliothèque standard, de votre matériel, de votre entrée, 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 laide de style C), la réponse la plus positive à la Comment analyser une chaîne en un int en C++? la question semble raisonnable. Cependant, je n'irais pas avec cette implémentation à moins que cela ne soit absolument nécessaire (principalement en raison d'avoir à jouer avec char* et \0 Résiliation).

3). Quel est le plus sûr à utiliser?

Voir le premier point.

De plus, si vous devez travailler avec char* et attention à \0 résiliation, vous préférez faire des erreurs; std::string est beaucoup plus facile et plus sûr à utiliser, car il s'occupe de toutes ces choses.

50
Ali