Y a-t-il une différence entre size_t
et container::size_type
?
Ce que je comprends, c'est size_t
est plus générique et peut être utilisé pour tout size_type
s.
Mais est container::size_type
optimisé pour des types spécifiques de conteneurs?
Les conteneurs standard définissent size_type
en tant que typedef à Allocator::size_type
(L'allocateur est un paramètre de modèle), qui pour std::allocator<T>::size_type
est généralement défini comme étant size_t
(ou un type compatible). Donc pour le cas standard, ce sont les mêmes.
Cependant, si vous utilisez un allocateur personnalisé, un type sous-jacent différent peut être utilisé. Alors container::size_type
est préférable pour une généralité maximale.
size_t
est défini comme le type utilisé pour la taille d'un objet et dépend de la plate-forme .container::size_type
est le type utilisé pour le nombre d'éléments dans le conteneur et dépend du conteneur .Tous les conteneurs std
utilisent size_t
comme size_type
, mais chaque fournisseur de bibliothèque indépendant choisit un type qu'il trouve approprié pour son conteneur.
Si vous regardez qt , vous constaterez que le size_type
des conteneurs Qt dépend de la version. En Qt3, c'était unsigned int
et dans Qt4 il a été changé en int
.
Pour std::[w]string
, std::[w]string::size_type
est égal à std::allocator<T>::size_type
, qui est égal à std::size_t
. Pour les autres conteneurs, il s'agit d'un type d'entier non signé défini par l'implémentation.
Parfois, il est utile d'avoir le type exact, donc par exemple, on sait où le type s'enroule (comme, pour UINT_MAX
) pour que l'on puisse s'en servir. Ou pour les modèles, où vous devez vraiment passer deux types identiques aux modèles de fonction/classe.
Je trouve souvent que j'utilise size_t
par souci de concision ou d'itérateurs de toute façon. Dans le code générique, puisque vous ne savez généralement pas avec quelle instance de conteneur votre modèle est utilisé et quelle taille ont ces conteneurs, vous devrez utiliser le Container::size_type
typedef si vous avez besoin de stocker la taille des conteneurs.