Pourquoi, dans les conteneurs C++, renvoie-t-il size_type
plutôt que int
? Si nous créons nos propres structures, devrions-nous aussi être encouragés à utiliser size_type
?
En général, size_t
devrait être utilisé chaque fois que vous mesurez la taille de quelque chose. Il est vraiment étrange que size_t
ne soit requis que pour représenter entre 0 et SIZE_MAX
octets et que SIZE_MAX
ne soit requis que de 65 535 ...
Les autres contraintes intéressantes des standards C++ et C sont:
sizeof()
est size_t
et il s’agit d’un entier non signéoperator new()
prend le nombre d'octets à allouer en tant que paramètre size_t
size_t
est défini dans <cstddef>
SIZE_MAX
est défini dans <limits.h>
dans C99 mais n'est pas mentionné dans C++ 98?!size_t
n'est pas inclus dans la liste des types entiers fondamentaux donc j'ai toujours supposé que size_t
est un alias de type pour l'un des types fondamentaux: char
, short int
, int
et long int
.Si vous comptez des octets, vous devriez certainement utiliser size_t
. Si vous comptez le nombre d'éléments, vous devriez probablement utiliser size_t
, car cela semble être ce que C++ a utilisé. Dans tous les cas, vous ne voulez pas utiliser int
- utilisez au minimum unsigned long
ou unsigned long long
si vous utilisez TR1. Ou ... encore mieux ... typedef
quoi que vous finissiez par utiliser pour size_type
ou tout simplement inclure <cstddef>
et utiliser std::size_t
.
Quelques raisons pourraient être:
Si vous écrivez une application juste pour vous et/ou jetable, vous pouvez probablement utiliser un int de base. Si vous écrivez une bibliothèque ou quelque chose de substantiel, size_t est probablement une meilleure solution.
Certaines des réponses sont plus compliquées que nécessaire. Size_t est un type entier non signé dont la taille est garantie pour stocker la taille en octets de tout objet en mémoire. En pratique, il a toujours la même taille que le type de pointeur. Sur les systèmes 32 bits, il s'agit de 32 bits. Sur les systèmes 64 bits, il s'agit de 64 bits.
Tous les conteneurs dans la stl ont différents types de fichiers. Par exemple, value_type
est le type d'élément et size_type
est le type de numéro stocké. De cette manière, les conteneurs sont complètement génériques en fonction de la plate-forme et de la mise en œuvre.
Si vous créez vos propres conteneurs, vous devez également utiliser size_type
. Ceci est généralement fait
typedef std::size_t size_type;
Si vous voulez la taille d'un conteneur, vous devez écrire
typedef vector<int> ints;
ints v;
v.Push_back(4);
ints::size_type s = v.size();
Ce qui est bien, c’est que si vous voulez utiliser une liste plus tard, remplacez simplement typedef par
typedef list<int> ints;
Et ça va encore marcher!
C++ est un langage qui pourrait être implémenté sur différentes architectures et plates-formes matérielles. Au fil du temps, il a pris en charge les architectures 16, 32 et 64 bits, et probablement d’autres à l’avenir. size_type
et d'autres alias de types permettent aux bibliothèques d'isoler les programmeurs/codes des détails d'implémentation.
En supposant que le size_type
utilise 32 bits sur les ordinateurs 32 bits et 64 bits sur les ordinateurs 64 bits, le même code source fonctionnerait probablement mieux si vous avez utilisé size_type si nécessaire. Dans la plupart des cas, vous pouvez supposer que ce serait la même chose que unsigned int
, mais ce n'est pas garanti.
size_type
est utilisé pour exprimer les capacités des conteneurs STL comme std::vector
alors que size_t
est utilisé pour exprimer la taille en octets d'un objet en C/C++.
Je suppose que vous voulez dire "size_t" - c'est une façon d'indiquer un entier non signé (un entier qui ne peut être que positif, jamais négatif) - cela a du sens pour la taille des conteneurs car vous ne pouvez pas avoir un tableau de taille de -7. Je ne dirais pas que vous devez utiliser size_t mais cela indique aux autres personnes utilisant votre code "Ce nombre est toujours positif." Cela vous donne également une plus grande gamme de nombres positifs, mais cela n’aura probablement aucune importance si vous n’avez pas de très gros conteneurs.
size_t
n'est pas signé, donc même s'ils sont tous deux en 32 bits, cela ne signifie pas tout à fait la même chose qu'un int non qualifié. Je ne sais pas pourquoi ils ont ajouté le type, mais sur de nombreuses plates-formes aujourd'hui, sizeof (size_t) == sizeof (int) == sizeof (long)
, le type que vous choisissez dépend de vous. Notez que ces relations ne sont pas garanties par la norme et deviennent rapidement obsolètes avec l’installation de plates-formes 64 bits.
Pour votre propre code, si vous avez besoin de représenter quelque chose qui est une "taille" conceptuellement et qui ne peut jamais être négatif, size_t
serait un choix judicieux.
il n'est pas garanti que les ints aient 4 octets dans la spécification, ils ne sont donc pas fiables. Oui, size_type serait préféré à ints