2013-10-08 5 views
4

Avertissement: Les liens sont à cppreference.comQuelles sont les différences entre std :: strtol et std :: stoi?

Je connais depuis un certain temps que std::atoi a été dépréciée et il a été recommandé d'utiliser std::strtol à la place.

C++ 11 a introduit std::stoi et j'essaie de comprendre pourquoi on choisirait de l'utiliser sur std::strtol. D'après ce que je comprends, stoi appelle strtol mais jette des exceptions. En outre, il renvoie un entier au lieu d'un long.

S'agit-il des principales différences, qu'est-ce qui me manque?

+0

duplication possible de [Pourquoi n'y a-t-il pas std :: stou?] (Http://stackoverflow.com/questions/8715213/why-is-there-no-stdstou) –

+0

@KerrekSB C'est vraiment une question sans rapport ... –

+0

@KerrekSB Ma question est de mieux comprendre pourquoi utiliser stoi si finalement il appelle juste strtol. – jmstoker

Répondre

7

S'agit-il des principales différences, qu'est-ce qui me manque?

Le plus récent, std::stoi travaille également directement à partir std::string (de sorte que vous n'avez pas à la litière de votre code avec .c_str() appels) et éventuellement vous fournit le premier caractère inégalé comme un indice via un size_t, plutôt que comme un pointeur.

Ces modifications simplifient l'utilisation de votre code.

+0

Donc, est-il sûr de supposer que stoi fournit la commodité au détriment de certains frais généraux en raison de casting interne pour convertir la chaîne et retourner un int? – jmstoker

+0

@jmstoker Je suppose que vous n'allez pas avoir beaucoup de temps, car vous devrez faire les mêmes conversions si vous utilisez 'std :: string' comme entrée. –

+0

Bon, je me demande simplement s'il y a plus de choses en cours, comme la logique fournissant les exceptions. Je suis probablement en train de l'analyser, mais ça m'a intrigué. – jmstoker

2

Une grande différence est que stoi prend un std::string comme argument, vous ne devez pas virer de bord .c_str() sur une chaîne pour le convertir en un entier.

Si vous voulez convertir en long, vous pouvez utiliser stol à la place (et même, stod, stofstold, stoul, stoll se convertir à double,float, long double, unsigned long et long long respectivement).

2

Vous utiliseriez std::stoi() si vous voulez passer un std::basic_string et que vous voulez sortir un int. Si vous préférez sortir un long vous appelez std::stol().

0

std:stoi n'est pas compatible avec C et contient la bibliothèque <string> qui a d'autres implémentations orientées objet qui ne peuvent pas être compilées par un compilateur C. Son scénario de cas d'utilisation principal (devrait) implique avec std: string au lieu de tableaux d'octets pour se conformer à la pratique commune C++ moderne.

-2

En fait, je me demande vraiment pourquoi il n'existe pas de fonction de modèle std :: FromString prenant le type auquel vous voulez convertir la chaîne en tant que paramètre de modèle. De même, une fonction de modèle ToString fait l'inverse.

Vous pouvez facilement imaginer l'implémentation à l'aide d'opérateurs d'insertion et d'extraction.

int i = std::FromString <int> (std::string ("2")) 
int j = std::FromString <int> ("2") 

std::string = ToString <double> (3.14159) 

Oui, bien sûr, les noms de fonction ne serait pas ont des lettres majuscules et ils seraient susceptibles from_string et to_string.

La spécialisation des modèles est bien sûr possible. Enfin, il n'y a vraiment aucune restriction que les types devraient être des types natifs, non?

+0

-1. Ne répond pas à la question. –

+0

True. Il "ne répond pas à la question". Mais la création des deux modèles est si facile que je pense réellement que la base de code résultante sera beaucoup plus lisible et plus facile à utiliser. (Oui, je les ai écrits, ce sont des exercices vraiment simples dans les fonctions de gabarit Malheureusement, parce que je les ai écrits comme faisant partie du produit de travail, je ne reproduis pas le code ici.) –

+2

Je ne discute pas de leur utilité. Boost a déjà 'lexical_cast' de toute façon. Je dis juste que ta réponse n'appartient pas ici. Peut-être qu'il appartient à votre blog, ou en réponse à une question qui demandait une troisième façon de convertir des types, plutôt que pour une comparaison de deux autres que cette réponse ignore complètement. –

1

Je préfère stoi() à strtol() car le premier renvoie std :: invalid_argument sur une entrée invalide. Dommage que le message d'exception dans GNUs libstdC++ ne soit pas utile. Ex: "what(): stoi"

Questions connexes