118 votes

'size_t' vs 'container::size_type'

Y a-t-il une différence entre size_t y container::size_type ?

Ce que je comprends, c'est que size_t est plus générique et peut être utilisé pour n'importe quel size_type s.

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

117voto

Evan Teran Points 42370

Les conteneurs standard définissent size_type en tant que typedef pour Allocator::size_type (Allocator est un paramètre de modèle), qui pour les std::allocator<T>::size_type est typiquement définie comme étant size_t (ou un type compatible). Dans le cas standard, ils sont donc identiques.

Toutefois, si vous utilisez un allocateur personnalisé, un type sous-jacent différent peut être utilisé. Ainsi, l'utilisation d'un type sous-jacent différent pourrait être utilisée. container::size_type est préférable pour une plus grande généralité.

3 votes

Pouvez-vous clarifier cette réponse ? J'ai examiné les projets de normes depuis le début de l'année. N1804 et je ne vois pas de lien entre Allocator::size_type y size_type . Un coup d'œil rapide à libstdc++ ne montre rien de semblable non plus.

1 votes

@ShafikYaghmour, Cette réponse est donc légèrement dépassée, mais pour maximiser la portabilité, je pense que le conseil est toujours valable : C++03 spécifiait "Tableau 32 : size_type : un type qui peut représenter la taille de l'objet le plus grand dans le modèle d'allocation". À l'époque, size_t a été la meilleure mise en œuvre pratique de ces contraintes. Toutefois, en C++11, elle est désormais définie essentiellement comme suit : std::make_unsigned<X::difference_type>::type par défaut. Ce qui, dans la pratique, sera probablement la même chose ou compatible avec size_t .

2 votes

CARE la réponse est incorrecte.... voir stackoverflow.com/questions/4849678/ TL:DR : le type de taille des allocateurs doit être size_t et en C++17, le type de taille sera déprécié tel quel.

47voto

TimW Points 5715
  • size_t est défini comme le type utilisé pour la taille d'un objet et est en fonction de la plate-forme .
  • container::size_type est le type utilisé pour le nombre d'éléments dans le conteneur et est dépendant d'un conteneur .

Tous std utilisation des conteneurs size_t en tant que size_type Mais chaque vendeur de bibliothèque indépendant choisit un type qu'il juge approprié pour son conteneur.

Si vous regardez qt vous constaterez que le size_type des conteneurs Qt dépend de la version. Dans Qt3, c'était unsigned int et dans Qt4, il a été remplacé par int .

1 votes

Je trouve un peu étrange que la taille d'un objet soit exprimée sous la forme d'un int. Pourrait-on jamais avoir une taille négative pour un conteneur ?

10 votes

@MihaiTodor : il n'est pas inhabituel pour les gens d'utiliser des types signés pour tout, je suppose que Qt suit le mouvement. La raison est que les opérations mixtes (en particulier les comparaisons) sont un tel désastre que beaucoup de gens préfèrent éviter d'utiliser des types non signés pour les nombres, plutôt que d'avoir à gérer et/ou éviter les opérations mixtes. Ce n'est pas parce que les types non signés ne peuvent pas exprimer des nombres négatifs, que vous devez avoir de les utiliser pour des nombres qui ne peuvent pas être négatifs :-) J'avoue que je suis surpris que ce soit int plutôt que ssize_t , int est un peu petit.

2 votes

"Tous les conteneurs std utilisent size_t comme type de taille" est très faux et trompeur. Oui, c'est ce qu'ils font EN GÉNÉRAL (du moins, tous mes compilateurs le faisaient), mais la référence au langage C++ n'indique pas qu'il faut que ce soit la même chose pour tous les conteneurs std !

9voto

Pour std::[w]string , std::[w]string::size_type est égal à std::allocator<T>::size_type qui est égale à la std::size_t . Pour les autres conteneurs, il s'agit d'un type d'entier non signé défini par l'implémentation.

Il est parfois utile d'avoir le type exact, afin de savoir par exemple où le type s'enroule (par exemple, à UINT_MAX ) afin de pouvoir l'utiliser. Ou pour les modèles, lorsqu'il est vraiment nécessaire de passer deux types identiques aux modèles de fonctions/classes.

Souvent, j'utilise size_t pour des raisons de brièveté ou d'itération. 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 est la taille de ces conteneurs, vous devrez utiliser la fonction Container::size_type typedef si vous avez besoin de stocker la taille des conteneurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X