web-dev-qa-db-fra.com

'size_t' vs 'container :: size_type'

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_types.

Mais est container::size_type optimisé pour des types spécifiques de conteneurs?

95
Charles Khunt

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.

96
Evan Teran
  • 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.

38
TimW

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.