Convertit une chaîne de court en C++
J'ai donc regardé autour pour savoir comment convertir une chaîne en un court et a trouvé beaucoup de choses sur la façon de convertir une chaîne en entier. Je voudrais laisser une question qu'un commentaire sur les threads, mais je n'ai pas assez de réputation. Donc, ce que je veux faire est de convertir une chaîne en bref, parce que le nombre ne devrait jamais aller au-dessus de trois ou au-dessous de zéro et shorts économiser de la mémoire (pour autant que je suis au courant).
Pour être clair, je ne parle pas des codes ASCII.
Une autre chose que je voudrais être en mesure de faire est de vérifier si la conversion de la chaîne à court échoue, parce que je vais être en utilisant une chaîne de caractères qui se compose d'un utilisateur d'entrer.
Je sais que je peux le faire avec une boucle while, mais si il y a une fonction intégrée pour le faire en C++, qui serait tout aussi ou plus efficace qu'une boucle while, j'aimerais en entendre parler.
shorts save memory
Je pense que la vraie question est de savoir pourquoi vous pensez que vous avez besoin pour économiser de la mémoire?Je pointilleux sur l'efficacité du programme, tout simplement parce que je suis une perfectionniste.
I obsess over program efficiency simply because I'm such a perfectionist
Eh bien, avez-vous écrire le code pour s'assurer que la règle est maintenue, à savoir the number should never go above three or below zero
?Comme avec tout ce qu'il y a un compromis à trouver, il y aura probablement peu de différence entre les résultats obtenus à l'aide de
short
s et int
s, sauf si vous utilisez long de tableaux / les structures avec ces types et cache entre en jeu. Vous devriez commencer à l'aide de int
s et seulement envisager autre chose si le profilage suggère que vous devriez. Lors de la programmation, vous devriez envisager de efficacité tout d'abord, est-il vraiment utile de votre temps à focaliser sur les problèmes que peut avoir presque aucun impact?Il est difficile de faire des déclarations générales, mais si vous parlez d'utiliser
short
s à la place de int
s pour des choses comme les paramètres de la fonction et les variables locales, alors il ne fera aucune différence. Avec mon compilateur et l'assembleur (GCC 5 sur OSX) l'appel d'une fonction qui prend un short
au lieu d'une int
résultats dans un octet supplémentaire de code assembleur pour l'instruction de sorte que même la (déjà infime) d'économie de l'espace facteur n'est pas en vaut la peine, sauf si vous êtes quelque chose de programmation intégré et chaque octet compte vraiment.OriginalL'auteur LarryK | 2015-02-13
Vous devez vous connecter pour publier un commentaire.
Fondamentalement, un
std::stos
fonction est absent pour des raisons inconnues, mais vous pouvez facilement rouler votre propre. Utilisationstd::stoi
convertirint
, vérifier la valeur contreshort
limites donné, par exemplestd::numeric_limits<short>
, jeterstd::range_error
si ce n'est pas dans la gamme, sinon renvoyer cette valeur. Il n'.Si vous avez déjà la bibliothèque Boost installé, vous pouvez utiliser
boost::lexical_cast
pour des raisons de commodité, mais sinon, je voudrais l'éviter (surtout pour le niveau de détail et de la bibliothèque de la dépendance,et c'est aussi un peu inefficace).Plus tôt
boost::lexical_cast
a été connu pour ne pas être très efficace, je crois, car il a été fondé en interne sur stringstreams, mais comme indiqué dans les commentaires ici la version moderne est plus rapide que la conversion via stringstream, et pour que la matière que par le biais descanf
.Je ne vais pas attraper votre poisson pour vous, ou le préparer pour vous. Compte tenu de votre commentaire au sujet de vouloir qu'il fait pour vous, vous avez vraiment besoin d'apprendre à pêcher et à préparer un poisson. La meilleure façon de le faire est de le faire.
Nice précisions au sujet de l'efficacité de l'lexicale fonte! C'est quelque chose que je obséder. Je vous remercie.
Hm. Comme il arrive je me suis trompé à ce sujet entre parenthèses remarque: les choses ont changé. J'ai donc marqué comme supprimé et ajouté plus up-to-date information. 😉
Il y a une autre SORTE de post quelque part où le gars fait des repères sur les différentes chaînes int routines
OriginalL'auteur Cheers and hth. - Alf
Un efficace est d'utiliser
boost::lexical_cast
:Vous aurez besoin d'installer bibliothèque boost et l'inclusion suivante:
#include <boost/lexical_cast.hpp>
Vous devez attraper
bad_lexical_cast
dans le cas où la conversion échoue:Oui, juste mis à jour
Comment l'efficacité d'un lexicale cast comparer à
short s; std::istringstream strm("100"); strm >> s;
?environ 20 fois plus rapide.
Ces analyses ont été réalisées sur les anciens compilateurs.
OriginalL'auteur Jérôme Leducq
Vous pouvez également utiliser
ssprintf
avec le%hi
spécificateur de format.Exemple:
h
&hh
des modificateurs pour être incroyablement utile, & pas seulement pourssprintf()
.OriginalL'auteur John Doe
Si vous vraiment vraiment besoin pour économiser de la mémoire, puis ce sera également l'ajustement dans un char (peu importe si le char est signé ou non signé).
Un autre "extrême" astuce: si vous pouvez faire confiance il n'y a pas de choses étranges comme "002" que ce que vous avez est une simple chaîne de caractères. Si c'est le cas, et vous vraiment vraiment besoin de performance, essayez:
OriginalL'auteur Bert Bril