web-dev-qa-db-fra.com

string :: size_type au lieu de int

const std::string::size_type cols = greeting.size() + pad * 2 + 2;

Pourquoi string::size_type? int est censé fonctionner! il contient des chiffres !!!

57
Delirium tremens

Un short contient aussi des chiffres. De même qu'un char signé.

Mais aucun de ces types n'est garanti d'être suffisamment grand pour représenter la taille des chaînes any.

string::size_type garantit exactement cela. Il s'agit d'un type suffisamment grand pour représenter la taille d'une chaîne, quelle que soit sa taille.

Pour un exemple simple expliquant pourquoi cela est nécessaire, considérez les plates-formes 64 bits. Un int est généralement encore 32 bits sur ceux-ci, mais vous avez bien plus de 2 ^ 32 octets de mémoire.

Donc, si un int (signé) était utilisé, vous ne pourriez pas créer de chaînes de plus de 2 ^ 31 caractères. size_type sera cependant une valeur 64 bits sur ces plateformes, donc il peut représenter des chaînes plus grandes sans problème.

98
jalf

L'exemple que vous avez donné,

const std::string::size_type cols = greeting.size() + pad * 2 + 2;

provient de C++ accéléré par Koenig . Il indique également la raison de son choix juste après cela, à savoir:

Le type std :: string définit size_type comme étant le nom du type approprié pour contenir le nombre de caractères dans une chaîne. Chaque fois que nous avons besoin d'une variable locale pour contenir la taille d'une chaîne, nous devons utiliser std :: string :: size_type comme type de cette variable.

La raison pour laquelle nous avons donné à cols un type de std :: string :: size_type est de s'assurer que cols est capable de contenir le nombre de caractères dans le message d'accueil, quelle que soit sa taille. Nous aurions pu simplement dire que cols a le type int, et en effet, cela fonctionnerait probablement. Cependant, la valeur de cols dépend de la taille de l'entrée de notre programme, et nous n'avons aucun contrôle sur la durée de cette entrée. Il est concevable que quelqu'un puisse donner à notre programme une chaîne si longue qu'un int est insuffisant pour contenir sa longueur.

23
mihai

Un typedef size_type Imbriqué est une exigence pour les conteneurs compatibles STL (ce que std::string Se trouve être), donc le code générique peut choisir le type entier correct pour représenter les tailles.

Il ne sert à rien de l'utiliser dans le code d'application, un size_t Est tout à fait correct (int ne l'est pas, car il est signé, et vous obtiendrez des avertissements de comparaison signés/non signés).

7
Marc Mutz - mmutz